绑定字典时ASP.NET MVC不需要的值

时间:2017-08-21 07:45:30

标签: c# asp.net asp.net-mvc asp.net-mvc-5

我需要接收数据的操作如下: /ContentPages/MyPage?id=1&param[test1]=testValue1&param[test2]=testValue2

所以,我编写了动作代码并且工作正常:

public ActionResult MyPage(int id, Dictionary<string, string> param)
{
  foreach (var pair in param)
  {
    //logger just prints string to file
    logger.Trace("{0}: {1}", pair.Key, pair.Value);
  }
  return View();
}

使用上面的URL打印:

test1: testValue1
test2: testValue2

但是当我没有传递任何参数(/ContentPages/MyPage?id=1)时,它会打印出来:

controller: ContentPages
action: MyPage

现在我正在使用代码:

public ActionResult MyPage(int id)
{
  foreach (var key in Request.QueryString.AllKeys)
  {
     if (key.StartsWith("param["))
     {
         logger.Trace("{0}: {1}", key, Request.QueryString[key]);
     }
  }
  return View();
}

我想在第一个例子中理解我做错了什么?

1 个答案:

答案 0 :(得分:0)

虽然我无法确切地说明为什么MVC框架会绑定到操作和控制器值,但我可以建议一种方法来获取您想要的行为(我认为):向{I}添加[FromQuery]属性要为模型绑定的参数。像这样:

public ActionResult MyPage(int id, [FromQuery] Dictionary<string, string> param)

这确保了模型绑定特定地来自查询字符串,而不是来自其他任何地方(例如请求正文,或者 - 我怀疑当你不包含查询字符串时发生 - 路由参数)。