繁体   English   中英

您如何序列化JS数组,以便Asp.net MVC可以将其绑定到ac#列表?

[英]How do you serialize a JS array so Asp.net MVC can bind it to a c# list?

我试图将一个可排序的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

这个问题(可以从此问题的解决方案中看到)是,如果post参数没有括号,则MVC似乎只能序列化为List。

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


编辑:动作的签名看起来像:

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

尝试添加以下传统选项: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/

好吧,这是我现在写的东西,可以正常工作!

这是动作:

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

添加它也很好。

如果您想在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);
    } 
});

当我将JavaScript数组传递到post方法中时,我将它们键入为int[]而不是List<int>

如果没有,请尝试此操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM