1

这是我现在面临的情况。我的 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它们都被正确绑定。trueFalseanotherStringanotherTrueFalse

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

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

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

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

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

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

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

4

1 回答 1

1

问题是当您收到一个包含一个元素的 json 数组时,它将被转换为 plain string。多个元素被正确地转换为IEnumerable. 在 JSON 中,单个元素被视为字典而不是数组。我建议使用 JSON.NET 为您处理解析,因为默认模型绑定器会导致此问题。

更多信息可以在这里找到:https ://stackoverflow.com/a/10122308/118224

于 2013-07-24T15:12:05.353 回答