如何使用 jQuery 将 int 列表发送到 ASP.net MVC 默认模型绑定器

发布于 2024-12-12 10:53:16 字数 902 浏览 0 评论 0原文

当我像这样用 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,似乎默认模型绑定器无法绑定它。

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


添加 解决方案

我使用了 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 默认模型绑定器正确获取值。

希望这对某人有帮助。

When I send a list of int's with jQuery like this:

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

Then jQuery will transform the pkList object and send it by post like this:

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

Which would be fine if the server is PHP but I use Asp.NET MVC3 and try to get these values with the default model binder:

public ActionResult Execute(ICollection<int> pkList)

But pkList is always null, it seems that the default model binder cannot bind it.

How do I solve this correctly?


ADDED SOLUTION

I used the solution from Darin Dimitrov with setting the traditional option in jQuery:

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

Now jQuery doesn't add the [] to the parameters anymore and they are sent like this:

pkList:1
pkList:2
pkList:3

And the MVC default model binder gets the values correctly.

Hope this helps someone.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

倦话 2024-12-19 10:53:16

您可以使用 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
});

You could use a JSON request as it will allow you to send any complex objects you wish:

$.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
    }
});

The JSON.stringify method is built in modern browsers and if you want to support legacy browsers you could include the json2.js script to your site.

And to answer your question you could use set the traditional: true option to indicate to jQuery to fallback to traditional serialization of parameters since this has changed in jQuery 1.4 and if you are using a later version you have the possibility to switch back to the way parameters are serialized:

$.ajax({ 
    url: '@Url.Action("Execute")',
    type: 'POST',
    data: {
        pkList: [1, 2, 3]
    },
    traditional: true
});
中二柚 2024-12-19 10:53:16

添加此内容是因为@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();
}

Adding this because @Darin miss the controller action.

Java script code:

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# code

[HttpPost]
public ActionResult ActionName(List<string> list)
{
    return View();
}
不一样的天空 2024-12-19 10:53:16

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

模型绑定到列表

Phil Haack has a great article on his blog that should point you in the right direct.

Model Binding To A List

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文