【问题标题】:Attribute routing not working with dictionaries属性路由不适用于字典
【发布时间】:2013-12-30 23:40:16
【问题描述】:

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

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

Table COMPANIES(任意数量的表之一,其中一个关联的 SELECT 查询存储在某处,由表名作为键):

ID  NAME    HQ  INDUSTRY
1   Apple   USA Consumer electronics
2   Bose    USA Low-quality, expensive audio equipment
3   Nokia   FIN Mobile Phones

控制器:

[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: 没有匹配的控制器 www.website.com/view/companies/hq=fin --> parameters 为空 www.website.com/view/companies/hq=fin&amp;name=nokia --> 例外:A potentially dangerous Request.Path value was detected from the client (&amp;).

当我使用:[Route("view/{table}{parameters}")] 我得到:

A path segment cannot contain two consecutive parameters. They must be separated by a '/' or by a literal string. Parameter name: routeTemplate。有道理。

我的问题是:如何在通常的key1=val1&amp;key2=val2 形式(不是一些尴尬的索引格式,如提到的here),稍后将绑定到 SQL 参数,最好使用 vanilla 数据结构,而不是像 FormCollection 这样的东西。

【问题讨论】:

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


    【解决方案1】:

    我不认为将 URL 参数绑定到 Dictionary 是框架内置的。如果您愿意,我相信有一种方法可以扩展它。

    我认为最快(但仍然可以接受)的选项是使用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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-18
      • 2022-11-01
      • 2021-02-28
      • 2013-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多