这是我现在面临的情况。我在我的MVC控制器中有一个动作,如下所示:
[HttpPost]
public JsonResult MyAction(int id, IEnumerable<string> strings, bool trueFalse, string anotherString, bool anotherTrueFalse) {}
我通过jQuery $.ajax
调用访问此内容,如下所示:
$.ajax({
type: 'POST',
dataType: 'json',
contentType: 'application/json; charset=utf-8',
data: {"id":12345,"strings":["onestring"],"trueFalse":false,"anotherString":"Woo String","anotherTrueFalse":false},
//Success/Error handlers here
});
现在,我看到的问题是:无论发送的数据是什么,id
,trueFalse
,anotherString
和anotherTrueFalse
都被绑定正确当我调试控制器操作并检查绑定到我的操作的参数时。
问题在于strings
:如果我发送一个带有单个字符串的JSON数组(如上所述),它永远不会被绑定到我的操作中的IEnumerable<string>
。如果我发送这样的东西:
"strings":["onestring", "twostring"]
然后它被绑定为具有两个条目的IEnumerable
。
这里发生了什么,我错过了什么?
注意:我刚刚尝试让映射首先工作,所以它仍然有点凌乱。我将通过将所有这五个属性放入视图模型来清理它,所以我只有一个对象绑定在这里 - 这可能完全解决了这个问题。但是,令我很好奇的是,当JSON数组只有一个条目时,这不起作用。
附录1 :在我上面的AJAX中,这基本上是在请求中发送到服务器的内容,但我实际上构建了该对象,然后将其传递给JSON.stringify - 只是尝试使问题陈述尽可能简单。您看到的是浏览器发送给控制器操作的内容。
附录2 :将所有这些属性放入他们自己的视图模型中已经清理了一些东西,但绑定问题仍然存在。此外,从IEnumerable<string>
切换到string[]
也会出现同样的问题,因此我从根本上忽略了MVC如何为我们执行模型绑定。
答案 0 :(得分:1)
问题是当你收到一个带有一个元素的json数组时,它会被转换成普通的string
。多个元素可以正确转换为IEnumerable
。在JSON中,单个元素被视为字典而不是数组。我建议使用JSON.NET来处理解析,因为默认的模型绑定器会给你带来麻烦。
可在此处找到更多信息:https://stackoverflow.com/a/10122308/118224