代码之家  ›  专栏  ›  技术社区  ›  KallDrexx

如何序列化JS数组,以便ASP.NET MVC可以将其绑定到C_列表?

  •  5
  • KallDrexx  · 技术社区  · 16 年前

    我正在尝试将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参数执行此操作时,MVC才似乎序列化到列表中 不是 有括号。

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


    编辑: 动作的签名如下:
     public ActionResult Publish(int projectId, List<int> publishedSectionIds)
    
    4 回复  |  直到 16 年前
        1
  •  3
  •   Okeydoke    16 年前

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

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

    看见

    从jquery 1.4开始,$.param()方法递归地序列化深层对象,以适应现代脚本语言和框架,如PHP和RubyonRails。您可以通过设置jquery.ajaxsettings.traditional=true;全局禁用此功能。

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

        2
  •  2
  •   Patricia    16 年前

    好吧,这是我刚写的东西,很管用!

    动作如下:

    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。

    我试着用列表being和i list或者列表,两者都可以。

    希望有帮助!

    编辑:

    我也像这样在没有模型的情况下测试了它:

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

    加上它也很管用。

        3
  •  0
  •   eapen    16 年前

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

    或者,如果要确保使用的是可排序(“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);
        } 
    });
    
        4
  •  0
  •   Jeremy Boyd    16 年前

    当我将javascript数组传入post方法时,我将它们作为 int[] List<int> .

    如果你没有,试试这个。