我需要接收数据的操作如下:
/ContentPages/MyPage?id=1¶m[test1]=testValue1¶m[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();
}
我想在第一个例子中理解我做错了什么?
答案 0 :(得分:0)
虽然我无法确切地说明为什么MVC框架会绑定到操作和控制器值,但我可以建议一种方法来获取您想要的行为(我认为):向{I}添加[FromQuery]
属性要为模型绑定的参数。像这样:
public ActionResult MyPage(int id, [FromQuery] Dictionary<string, string> param)
这确保了模型绑定特定地来自查询字符串,而不是来自其他任何地方(例如请求正文,或者 - 我怀疑当你不包含查询字符串时发生 - 路由参数)。