Asp.net web api 属性路由不使用字典

Asp.net web api 属性路由不使用字典,asp.net-web-api,dapper,attributerouting,asp.net-web-api2,Asp.net Web Api,Dapper,Attributerouting,Asp.net Web Api2,作为属性路由的新手,我想寻求帮助以使其正常工作 这个测试是一个简单的动态DB表查看器:给定一个表名(或存储的查询名或其他名称)和一些WHERE参数,返回查询结果 表公司(任意数量的表中的一个,其中有一个关联的SELECT查询存储在某处,由表名键入): 控制器: [Route("view/{table}/{parameters}")] public object Get(string table, Dictionary<string, string> parameters) {

作为属性路由的新手,我想寻求帮助以使其正常工作

这个测试是一个简单的动态DB表查看器:给定一个表名(或存储的查询名或其他名称)和一些WHERE参数,返回查询结果

表公司(任意数量的表中的一个,其中有一个关联的SELECT查询存储在某处,由表名键入):

控制器:

[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
}
请求(看起来应该干净,但确切的URL格式并不重要):

www.website.com/view/companys?hq=fin
-->404:没有匹配的控制器
www.website.com/view/companys/hq=fin
-->参数为空
www.website.com/view/companys/hq=fin&name=nokia
-->异常:
一个潜在危险的请求。从客户端(&)检测到路径值。

当我使用:
[Route(“view/{table}{parameters}”)]
时,我得到:

路径段不能包含两个连续参数。它们必须用“/”或文字字符串分隔。参数名称:routeTemplate
。有道理


我的问题是:我如何接受一个表名和任何数量的未知参数(通常是
key1=val1&key2=val2
格式,而不是像上面提到的那种笨拙的索引格式),这些参数稍后将绑定到SQL参数,最好使用普通的数据结构,而不是像
FormCollection

这样的东西。我不认为将URL参数绑定到字典是框架内置的。如果你想的话,我相信有办法扩展它

我认为最快(但仍然可以接受)的选择是使用
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
}
[路由(“视图/{table}”)]
公共对象获取(字符串表){
字典参数=Request.GetQueryNameValuePairs()
.ToDictionary(x=>x.Key,x=>x.Value);
var sql=GetSql(表);
var dbArgs=新的动态参数(参数);
return Database.Query(sql,dbArgs);//return stuff/与问题无关
}
SELECT * FROM companies
WHERE name = :name
-- OR hq = :hq
-- OR ...etc. Doesn't matter since it never gets this far.
[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
}