在没有表单的情况下将对象列表发布到控制器

本文关键字:列表 控制器 对象 表单 情况下 | 更新日期: 2023-09-27 18:23:43

我用以下视图模型创建了一个简单的测试场景:

public class TestViewModel
{
    public int Number1 { get; set; }
    public int Number2 { get; set; }
    public int Number3 { get; set; }
}

控制器中的ActionResult:

[HttpPost]
public ActionResult TestMethod(List<TestViewModel> testList)
{
    // irrelevant code here
}

然后在视图中发布以下javascript代码到控制器:

var testList = [];
for (var i = 0; i < 10; i++) {
    testList.push({
        Number1: i,
        Number2: 2,
        Number3: 3
    });
}
$.ajax({
    type: 'POST',
    url: '@Url.Action("TestMethod")',
    data: { testList: testList },
    dataType: 'json',
    //traditional: true
});

在谷歌chrome中,它以表单数据的形式发送以下内容:

testList[0][Number1]:0
testList[0][Number2]:2
testList[0][Number3]:3
.
.
testList[9][Number1]:9
testList[9][Number2]:2
testList[9][Number3]:3

然后,当它到达控制器中的TestMethod时,testList是长度为10的List<TestModel>,但所有属性都设置为0

我尝试了traditional: true,当检查流量时,它会发送以下信息:

testList:[object Object]
.
.
testList:[object Object]

并且testList在控制器中的TestMethod中为空。

也许只是晚了,我没有正确思考,但我做错了什么?为什么不设置List<TestViewModel> testList中各个项目的值?

我看到过这样一个问题:如何在没有表单的情况下将字符串数组发布到ASP.NET MVC控制器?但当列表是自定义对象时,这似乎不起作用。

在没有表单的情况下将对象列表发布到控制器

您需要在操作中指定一个前缀,如下所示:

[HttpPost]
public ActionResult TestMethod([Bind(Prefix = "testList")] List<TestViewModel> testList)
{
    // irrelevant code here
}

所以,在用头撞墙3个小时后,我发现解决方案是将数据发布为json。希望这能在未来帮助其他人:

$.ajax({
    type: 'POST',
    url: '@Url.Action("TestMethod")',
    contentType: 'application/json', // added
    data: JSON.stringify(testList), // changed
    dataType: 'json'
});

现在我可以放心地睡觉了。