使用IEnumerable <string> </string>的AJAX请求的MVC绑定

时间:2013-07-24 14:46:48

标签: jquery asp.net-mvc json model-binding

这是我现在面临的情况。我在我的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
});

现在,我看到的问题是:无论发送的数据是什么,idtrueFalseanotherStringanotherTrueFalse都被绑定正确当我调试控制器操作并检查绑定到我的操作的参数时。

问题在于strings:如果我发送一个带有单个字符串的JSON数组(如上所述),它永远不会被绑定到我的操作中的IEnumerable<string>。如果我发送这样的东西:

"strings":["onestring", "twostring"]

然后它被绑定为具有两个条目的IEnumerable

这里发生了什么,我错过了什么?

注意:我刚刚尝试让映射首先工作,所以它仍然有点凌乱。我将通过将所有这五个属性放入视图模型来清理它,所以我只有一个对象绑定在这里 - 这可能完全解决了这个问题。但是,令我很好奇的是,当JSON数组只有一个条目时,这不起作用。

附录1 :在我上面的AJAX中,这基本上是在请求中发送到服务器的内容,但我实际上构建了该对象,然后将其传递给JSON.stringify - 只是尝试使问题陈述尽可能简单。您看到的是浏览器发送给控制器操作的内容。

附录2 :将所有这些属性放入他们自己的视图模型中已经清理了一些东西,但绑定问题仍然存在。此外,从IEnumerable<string>切换到string[]也会出现同样的问题,因此我从根本上忽略了MVC如何为我们执行模型绑定。

1 个答案:

答案 0 :(得分:1)

问题是当你收到一个带有一个元素的json数组时,它会被转换成普通的string。多个元素可以正确转换为IEnumerable。在JSON中,单个元素被视为字典而不是数组。我建议使用JSON.NET来处理解析,因为默认的模型绑定器会给你带来麻烦。

可在此处找到更多信息:https://stackoverflow.com/a/10122308/118224