我的大多数模型都使用$('form').serializeArray()
填充,但是需要从其管理器填充形成分页网格的对象数组。
例如:
public JsonResult SubmitForm(MyViewModel input)
{
...
public class MyViewModel
{
[Display(Name = "Name")]
public string GridName { get; set; }
[Display(Name = "Description")]
public string GridDescription { get; set; }
public GridRow[] GridRows { get; set; }
serializeArray()
将提取姓名和说明,不存在任何问题。如果GridRow
是string[]
,那么它接受我只需将多个实例推送到jquery所做的序列化数组中:
var data = $('form').serializeArray();
for (var i in gridData) {
data.push({ name: 'GridRows', value: gridData[i].id });
}
$.ajax({
type: "POST",
url: '/Central/Results/SubmitForm',
dataType: "json",
data: data,
这样我至少可以获得一系列ID。但是,当我想填充正确的数据类型时,它不允许我将整个对象推入其中(gridData[i]
)。当它到达控制器时,我总是得到一个空值。
知道我需要如何处理数据才能让MVC正确填充模型?感谢。
答案 0 :(得分:1)
我很确定这与您在Ajax帖子中将traditional
选项设置为true
有关。就发布到MVC控制器操作的时间而言,jQuery处理数组的方式与您预期的有所不同。
这样做:
$.ajax({
type: "POST",
url: '/Central/Results/SubmitForm',
dataType: "json",
traditional: true,
data: data,
...
有关详细信息,请参阅this answer。
答案 1 :(得分:0)
原来只需要添加一行和属性引用,并分别添加每个变量。
for (var i in gridData) {
for (var j in gridData[i]) {
data.push({ name: 'GridRows[' + i + '].' + j, value: gridData[i][j] });
}
}
编辑:只是想我发布了我之前写的更新的帮助方法。
function serializeArray(obj, data, name) {
/// <summary>Turns an object into an MVC standard array of values </summary>
/// <param name="obj" type="Object">Object to serialise (required)</param>
/// <param name="data" type="Array">Array to append data to end of (optional)</param>
/// <param name="name" type="String">Name prefix for all entries (optional/ignore)</param>
if (!data || !(data instanceof Array)) {
data = [];
}
if (obj instanceof Array) {
if (!name) {
throw "Need an object name when converting an array";
}
for (var index = 0; index < obj.length; index++) {
data = serializeArray(obj[index], data, name + '[' + index + ']');
}
} else if (obj instanceof Object) {
for (var property in obj) {
if (obj.hasOwnProperty(property)) {
data = serializeArray(obj[property], data, name ? (name + '.' + property) : property);
}
}
} else {
data.push({ name: name, value: obj });
}
return data;
}