【问题标题】:How to send a list of int with jQuery to ASP.net MVC Default Model Binder如何使用 jQuery 将 int 列表发送到 ASP.net MVC 默认模型绑定器
【发布时间】:2011-10-28 16:05:39
【问题描述】:

当我像这样使用 jQuery 发送一个 int 列表时:

$.ajax('@Url.Action("Execute")', {
    type: 'POST',
    data: {
        pkList: [1,2,3]
    }
});

然后 jQuery 将转换 pkList 对象并像这样通过邮寄方式发送:

pkList[]:1
pkList[]:2
pkList[]:3

如果服务器是 PHP 但我使用 Asp.NET MVC3 并尝试使用默认模型绑定器获取这些值,这会很好:

public ActionResult Execute(ICollection<int> pkList)

但是pkList总是为null,好像默认的model binder无法绑定。

我该如何正确解决这个问题?


添加 解决方案

我使用了 Darin Dimitrov 的解决方案,在 jQuery 中设置了 traditional 选项:

$.ajax('@Url.Action("Execute")', {
    type: 'POST',
    traditional: true,
    data: {
        pkList: [1,2,3]
    }
});

现在 jQuery 不再将 [] 添加到参数中,它们的发送方式如下:

pkList:1
pkList:2
pkList:3

并且 MVC 默认模型绑定器正确获取值。

希望这对某人有所帮助。

【问题讨论】:

    标签: jquery asp.net-mvc-3 defaultmodelbinder


    【解决方案1】:

    您可以使用 JSON 请求,因为它允许您发送任何您希望的复杂对象:

    $.ajax({
        url: '@Url.Action("Execute")',
        type: 'POST',
        contentType: 'application/json; charset=utf-8',
        data: JSON.stringify({ pkList: [1, 2, 3] }), // you could throw any javascript object you like here
        success: function(result) {
            // process the results
        }
    });
    

    JSON.stringify 方法内置于现代浏览器中,如果您想支持旧版浏览器,您可以将json2.js 脚本包含到您的站点中。

    为了回答您的问题,您可以使用设置 traditional: true 选项来指示 jQuery 回退到参数的 传统 序列化,因为这在 jQuery 1.4 中已经改变并且如果您使用的是更高版本您可以切换回参数序列化的方式:

    $.ajax({ 
        url: '@Url.Action("Execute")',
        type: 'POST',
        data: {
            pkList: [1, 2, 3]
        },
        traditional: true
    });
    

    【讨论】:

    • 默认模型绑定器不也处理表单编码数据的逗号分隔列表吗?像data: { pkList: '1,2,3' } 这样的东西?但除此之外,我将这种方法用于我所有的模型序列化,这是在 JS 中处理更复杂对象的方法。
    • @PaulT.,不,默认模型绑定器不会接受 data: { pkList: '1,2,3' }。如果您想处理此类请求,则需要自定义模型绑定器,您需要拆分条目,然后将每个条目解析回一个整数。如果目标是将整数数组发送到控制器操作,则没有必要经历这种痛苦。
    • 是的,我明白你的意思了不处理(即 pkList=1&pkList=2 有效)
    • @PaulT.:您准确地指出,(新的)默认 jQuery json 列表序列化与默认的 mvc 3 默认模型绑定器 json 反序列化不匹配。仅仅因为 mvc 是 jQuery 自带的,这不是有点奇怪吗?
    • @DarinDimitrov:非常感谢,从来不知道 jQuery 中的 traditional 选项。我在我的默认 ajax 选项中设置了它,并且在我的项目中再也不用关心它了,效果很好!也很高兴知道JSON.stringify 方法。我不知道为什么 jQuery 中不包含这个(回退到旧版浏览器),我认为应该是?
    【解决方案2】:

    添加这个是因为@Darin 错过了控制器操作。

    Java 脚本代码:

    function sendArray() {
        var list = ["a", "b"];
    
        $.ajax({
            url: '@Url.Action("ActionName")',
            type: 'POST',
            contentType: "application/json; charset=utf-8",
            data: JSON.stringify({ list }),
            dataType: "json",
            success: function (response) {},
            error: function (response) {}
        });
    }
    

    C#代码

    [HttpPost]
    public ActionResult ActionName(List<string> list)
    {
        return View();
    }
    

    【讨论】:

    • 我正在采用同样的方法。但是,服务器会收到 null。
    【解决方案3】:

    Phil Haack 在他的博客上有一篇很棒的文章,应该可以为您指明正确的方向。

    Model Binding To A List

    【讨论】:

    • 谢谢伙计,我以前读过,但这对我没有帮助,问题更多出在 jQuery 方面 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多