作为属性路由的新手,我想请求帮助使其正常工作。
此测试是一个简单的动态数据库表查看器:给定表名称(或存储的查询名称或其他名称)和可选的一些 WHERE 参数,返回查询结果。
表 COMPANIES(任意数量的表之一,其中存储有关联的 SELECT 查询,以表名作为键):
ID NAME HQ INDUSTRY
1 Apple USA Consumer electronics
2 Bose USA Low-quality, expensive audio equipment
3 Nokia FIN Mobile Phones
Controller :
[Route("view/{table}/{parameters}")]
public object Get(string table, Dictionary<string, string> parameters) {
var sql = GetSql(table);
var dbArgs = new DynamicParameters(parameters);
return Database.Query(sql, dbArgs); // Return stuff/unrelated to problem
}
存储在某些资源或表中的 SQL。显然参数必须完全匹配:
SELECT * FROM companies
WHERE name = :name
-- OR hq = :hq
-- OR ...etc. Doesn't matter since it never gets this far.
请求(应该看起来很干净,但确切的 URL 格式并不重要):
www.website.com/view/companies?hq=fin
--> 404:没有匹配的 Controller
www.website.com/view/companies/hq=fin
--> parameters
为空
www.website.com/view/companies/hq=fin&name=nokia
--> 异常:从客户端检测到潜在危险的 Request.Path 值 ( &).
当我使用:[Route("view/{table}{parameters}")]
时,我得到:
路径段不能包含两个连续的参数。它们必须用“/”或文字字符串分隔。参数名称:routeTemplate
。有道理。
我的问题是:我如何接受表名和任意数量的未知参数通常的 key1=val1&key2=val2
形式(不是某种笨拙的索引格式,如提到的 here ),稍后将绑定(bind)到 SQL 参数,最好使用普通数据结构而不是像 FormCollection
这样的东西。
最佳答案
我不认为将 URL 参数绑定(bind)到字典是框架内置的。我确信如果您愿意的话,有办法扩展它。
我认为最快(但仍然可以接受)的选择是使用 Request.GetQueryNameValuePairs()
获取查询字符串参数,如下所示:
[Route("view/{table}")]
public object Get(string table) {
Dictionary<string, string> parameters = Request.GetQueryNameValuePairs()
.ToDictionary(x => x.Key, x => x.Value);
var sql = GetSql(table);
var dbArgs = new DynamicParameters(parameters);
return Database.Query(sql, dbArgs); // Return stuff/unrelated to problem
}
关于asp.net-web-api - 属性路由不适用于字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20849429/