你如何序列化一个JS数组,以便Asp.net MVC可以将它绑定到一个c#列表?

时间:2010-07-28 00:39:14

标签: javascript asp.net-mvc arrays

我正在尝试将一个jquery可排序项目列表发送到我的MVC方法进行数据处理。目前我正在尝试通过以下代码发送它:

var data = {};
data.projectId = projectId;
data.publishedSectionIds = $('#section_list').sortable('toArray');

// Perform the ajax
$.ajax({ url: '/Project/Publish',
    type: 'POST',
    data: data,
    success: function (result) {
        alert(result.message);
    } 
});

此代码的问题在于它使Post参数如下所示:

projectId=2&publishedSectionIds[]=1&publishedSectionIds[]=2

这个问题(正如this question的解决方案可以看到的)是,如果post参数 NOT 有括号,MVC似乎只序列化为List。

如何序列化javascript数组,以便我使用List<int>参数模型的操作正确绑定?

<小时/> 编辑:操作的签名如下:

 public ActionResult Publish(int projectId, List<int> publishedSectionIds)

4 个答案:

答案 0 :(得分:3)

尝试添加以下传统选项:true

例如

$.ajax({ url: '/Project/Publish',
    type: 'POST',
    data: data,
    traditional: true,
    success: function (result) {
        alert(result.message);
    } 
});

  

从jQuery 1.4开始,$ .param()方法递归地序列化深层对象,以适应现代脚本语言和框架,如PHP和Ruby on Rails。您可以通过设置jQuery.ajaxSettings.traditional = true;。

来全局禁用此功能

http://api.jquery.com/jQuery.param/

答案 1 :(得分:2)

好的,这就是我现在写的有用的东西!

这是行动:

Public Overridable Function PostProject(ByVal model As Project) As ActionResult
    Return Json(model.PublishedSectionIds)

End Function

这是班级:

Public Class Project
    Public Property ProjectId As Integer
    Public Property PublishedSectionIds As IList(Of Integer)
End Class

这是javascript:

        var data = {};
        data.ProjectId = 1;

        data.PublishedSectionIds = $('#section_list').sortable('toArray');
        var url=  "/testing/tester";
        $.ajax({ 
            url:url,
            type: 'POST',
             traditional: true,
            data: data,
            success: function (result) {
                alert(result);
            }
        });

忽略我的行为可以覆盖的事实。这只是来自t4mvc。

我尝试使用列表和IList或List,两者都工作正常。

希望有所帮助!

编辑:

我还测试了它没有这样的模型:

    Public Overridable Function PostProject2(ByVal ProjectId As Integer, ByVal PublishedSectionIds As List(Of Integer)) As ActionResult
        Return Json(PublishedSectionIds)

    End Function

添加它也很好。

答案 2 :(得分:0)

如果你想在JS中完全处理它(你可能需要编辑第2行 - 我假设你正在使用一个列表,并试图自己提取id属性)

var data = "projectId=" + projectId;
$("#section_list li").each(function(){ data += "&publishedSectionIds=" + this.id;});
$.ajax({ url: '/main/test',
    type: 'POST',
    data: data,
    success: function (result) {
        alert(result.message);
    } 
});

或者如果你想确保使用sortable('toArray')数据(虽然上面的结果也提供了排序数据)

var data = "projectId=" + projectId;
var tempData = $('#section_list').sortable('toArray');
$.each(tempData, function(index, value){ data += "&publishedSectionIds=" + value;});
$.ajax({ url: '/main/test',
    type: 'POST',
    data: data,
    success: function (result) {
        alert(result.message);
    } 
});

答案 3 :(得分:0)

当我将JavaScript数组传入我的post方法时,我将其键入为int[]而不是List<int>

如果你没有,请尝试这个。