【问题标题】:Get Dictionary<int, int[]> from query string ASP.NET MVC [closed]从查询字符串 ASP.NET MVC 中获取 Dictionary<int, int[]> [关闭]
【发布时间】:2018-09-26 11:45:11
【问题描述】:

我的操作方法中有一个参数:Dictionary&lt;int, int[]&gt; prop,我正在尝试通过查询字符串来设置它。但是当我使用这个时:

/Action?prop[0].Key=123&prop[0].Value[0]=123

字典参数不为空但没有元素。

我做错了什么,我应该如何让它发挥作用?

注意:这是一个页面,所以它是一个没有正文的 HTTP GET 请求。

【问题讨论】:

  • 似乎你最好将它编码为正文中的 JSON 而不是污染 url。
  • 您的代码运行良好且绑定正确
  • @juharr 这是一个 GET 请求。它没有身体。
  • 控制器应该如何将“123”绑定到int[]
  • @StephenMuecke 你确定吗?因为我检查时它不起作用?

标签: c# asp.net asp.net-mvc dictionary query-string


【解决方案1】:

根据您的型号,您可能需要自定义ModelBinder。有关如何构建的更多信息,请参阅Microsoft Reference

自定义模型绑定器可让您决定 URL 查询参数的外观。例如,您可以构建一个如下所示:

/Action?dict=(1;1,2,3)(17;90,16,12345)(88;1,2,5,7,8,9,3,4,5,6,7,8,9)

除了看起来更漂亮并且不会泄露您的实现细节之外,这还意味着您不必担心空间不足。因为大多数浏览器不支持超过 4000 个字符的 URL,所以如果您的字典较大,则每次重复变量名称在 URL 空间方面的成本很高。

【讨论】:

  • 如图所示的 OP 代码可以正常工作 - 不需要自定义模型绑定器
【解决方案2】:

使用[FromUri] 属性将参数标记为 MVC 控制器操作,如下所示: public HttpResponseMessage ActionName([FromUri] Dictionary<int, int[]> prop) { ... } 在请求 URI 中,按如下方式附加字典: /actionName?prop[0].key=0&prop[0].value=11&prop[0].value=12&prop[1].key=1&prop[1].value=21&prop[1].value=22

这导致prop 字典被填充如下: ` 道具: { 0 : [11, 12], 1 : [21, 22] }

`

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    相关资源
    最近更新 更多