asp.net-web-api - 属性路由不适用于字典

标签 asp.net-web-api dapper attributerouting asp.net-web-api2

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

此测试是一个简单的动态数据库表查看器:给定表名称(或存储的查询名称或其他名称)和可选的一些 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/

相关文章:

c# - .NET Core 中的专用路由无法识别,生成 404

c# - 在不调用外部 api 的情况下在 rest web API 的 Controller 内部查找客户端公共(public) IP 地址

c# - 使用动态列名称更新 Dapper

c# - DB Transaction : can we block just a record, 不是整个表?

asp.net-mvc - 为什么我的命名路线不起作用?

c# - 使用 HttpClient 通过 AttributeRouting 在 URL 中发送日期

.net - 尝试激活 'DatabaseConfiguration' 时无法解析类型 'MyDbContext' 的服务

c# - Web API 调用未到达?

c# - 需要修改参数的参数化查询mySQL

c# - 如何在 asp.net mvc 中以编程方式确定路由前缀?