带有 jQ​​uery Ajax 调用的 MVC 无法正确绑定空数组/可枚举

Posted

技术标签:

【中文标题】带有 jQ​​uery 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;

断言失败,因为numbersList&lt;int&gt; 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)

以上是关于带有 jQ​​uery Ajax 调用的 MVC 无法正确绑定空数组/可枚举的主要内容,如果未能解决你的问题,请参考以下文章

带有 jQ​​uery 异步 AJAX 调用的 While 循环

带有 jQ​​uery 的 Asp Mvc 视图

带有 jQ​​uery Ajax 的 JWT 令牌

带有 jQ​​uery.ajax() 的 CORS

带有 jQ​​uery AJAX 的 JSONP 回调函数

哪些浏览器不支持带有 jQ​​uery.ajax 的 HTTP DELETE? [复制]