我正在尝试将一个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)
答案 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;。
来全局禁用此功能
答案 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>
。
如果你没有,请尝试这个。