带有 jQuery Ajax 调用的 MVC 无法正确绑定空数组/可枚举
Posted
技术标签:
【中文标题】带有 jQuery Ajax 调用的 MVC 无法正确绑定空数组/可枚举【英文标题】:MVC with jQuery Ajax call does not correctly bind empty array/enumerable 【发布时间】:2011-12-24 10:47:21 【问题描述】:我有一个 jQuery ajax 调用,我在其中尝试发送可以从复选框表中选择的用户的 int ID。
我在没有选择用户的情况下遇到问题。我期望一个空数组,但实际上我收到一个长度 = 1 的数组,其中包含 userId 0(即未分配的 int 值)。
下面的sn -p重现问题
$('#test').click(function ()
var numbers = $('.noElements').map(function ()
// (selector does not match any elements, to demonstrate)
return 1;
).get();
$.ajax(
url: '/MyController/Test',
type: "GET",
data: numbers: numbers, count: numbers.length
);
);
public ActionResult Test(IEnumerable<int> numbers, int count)
Assert(numbers.Count() == count);
return null;
断言失败,因为numbers
是List<int> 0
。为什么绑定会这样?
【问题讨论】:
代码有点混乱,您将数字设置为“1”,即 numbers.Count() 为 1。但理想情况下,当没有选择用户时,numbers.Count() 理想情况下应该为“0” ”。然后断言失败了。这是正确的吗? 您能否在您的操作方法中尝试以下更改,看看是否有效。将 IEnumerable 替换为 IList。看看有没有用,如果有的话,我会在这个帖子里加个详细的回答。 Numbers 是一个长度为 0 的 1 数组。从IEnumerable
更改为IList
不会有任何区别。
【参考方案1】:
我相信默认模型绑定器会将 jQuery AJAX 调用传递给它的空字符串转换为一个整数数组,该数组包含一个包含整数 (0) 的默认值的单个元素。如果你做这样的事情,你的代码会起作用-
$('#test').click(function ()
var numbers = $('.noElements').map(function ()
return 1;
);
if (numbers.length == 0)
numbers = null;
count = 0;
else count = numbers.length;
$.ajax(
url: '/Home/Test',
type: "GET",
data: numbers: numbers, count: count
);
);
有关更多信息和替代解决方案,请参阅此问题 - How to post an empty array (of ints) (jQuery -> MVC 3)
【讨论】:
是的,MVC 中似乎不支持传递空数组。多么奇怪。我想知道他们以这种方式实现它的原因是什么,无论如何我都不会立即明白。 实际上,我不得不删除我的答案,因为在我的情况下,即使是非空数组也以不正确的方式序列化(mvc2)以上是关于带有 jQuery Ajax 调用的 MVC 无法正确绑定空数组/可枚举的主要内容,如果未能解决你的问题,请参考以下文章