Javascript NETMVC4自动从表单post中的对象数组绑定模型
我已经用JavaScript构建了一个对象数组,并希望通过Ajax将它们发布回服务器(Im使用jQuery) JavaScript对象数组如下所示:Javascript NETMVC4自动从表单post中的对象数组绑定模型,javascript,arrays,asp.net-mvc,model-binding,form-post,Javascript,Arrays,Asp.net Mvc,Model Binding,Form Post,我已经用JavaScript构建了一个对象数组,并希望通过Ajax将它们发布回服务器(Im使用jQuery) JavaScript对象数组如下所示: var columns = [ { name: 'col 1', source: 'whatever', hidden: false, width: 50 }, ... ]; $.post('/MyController/MyAction', { 'columns': columns }); public class JqGrid
var columns = [
{ name: 'col 1', source: 'whatever', hidden: false, width: 50 },
...
];
$.post('/MyController/MyAction', { 'columns': columns });
public class JqGridColumn
{
public string name;
public string source;
public int width;
public bool hidden;
}
我会像这样发回:
var columns = [
{ name: 'col 1', source: 'whatever', hidden: false, width: 50 },
...
];
$.post('/MyController/MyAction', { 'columns': columns });
public class JqGridColumn
{
public string name;
public string source;
public int width;
public bool hidden;
}
在控制器操作上,我当前收到以下消息:
我有一个名为JqColumn
的c#对象,我想将帖子绑定到其中,它看起来像这样:
var columns = [
{ name: 'col 1', source: 'whatever', hidden: false, width: 50 },
...
];
$.post('/MyController/MyAction', { 'columns': columns });
public class JqGridColumn
{
public string name;
public string source;
public int width;
public bool hidden;
}
因此,我认为在控制器操作中添加类型为JqGridColumn[]columns
的参数会自动绑定发布的数据,但不会(它生成一个数组,具有正确的元素数,但数组中的每个项都有空值)
谁能告诉我我做错了什么?谢谢
更新
目前,我正在手动绑定控制器操作中的项,如下所示:
public void ColumnChooser(JqGridColumn[] columns)
{
for (int i = 0; i < columns.Length; i++)
{
columns[i].hidden = bool.Parse(Request.Form["columns[" + i + "][hidden]"]);
columns[i].width = int.Parse(Request.Form["columns[" + i + "][width]"]);
columns[i].name = Request.Form["columns[" + i + "][name]"];
columns[i].source = Request.Form["columns[" + i + "][source]"];
}
return;
}
public void列选择器(JqGridColumn[]列)
{
for(int i=0;i
…这很好,但我真的很想知道.Net MVC(正确的)方法 这是因为JqGridColumn对象需要属性,而不是字段。参考此问题:
尝试使用传统的:true设置回发 和数据类型:json
$.ajax({
url: '/MyController/MyAction',
method: 'POST',
traditional: true,
dataType: json
data: columns ,
sucess: function () { alert('Success'); }
});
由于您没有为
JqGridColumn
类型注册特定的ModelBinder
,因此将使用DefaultModelBinder
。但是:
- 它不会绑定字段,只绑定公共属性
- 数组绑定的预期格式为
列[0]。当您实际发布
时,name列[0][name]
列,而不是名称-值对,那么问题很容易解决:
$.ajax({
url: '/MyController/MyAction',
method: 'POST',
contentType: 'application/json',
data: JSON.stringify({ columns: columns })
});
binders.Add(typeof(JqGridColumn), new JqGridColumnBinder());
但是,如果您不想更改您的类,您可以注册一个特定于JqGridColumn
的ModelBinder
,并让它甚至可以处理字段和当前的jQuery序列化:
public class JqGridColumnBinder : DefaultModelBinder
{
protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)
{
string name = bindingContext.ValueProvider.GetValue(bindingContext.ModelName + "[name]").AttemptedValue;
string source = bindingContext.ValueProvider.GetValue(bindingContext.ModelName + "[source]").AttemptedValue;
int width = (int)bindingContext.ValueProvider.GetValue(bindingContext.ModelName + "[width]").ConvertTo(typeof(int));
bool hidden = (bool)bindingContext.ValueProvider.GetValue(bindingContext.ModelName + "[hidden]").ConvertTo(typeof(bool));
return new JqGridColumn
{
name = name,
source = source,
width = width,
hidden = hidden
};
}
}
然后在App_Start/ModelBindingConfig.cs中注册它:
$.ajax({
url: '/MyController/MyAction',
method: 'POST',
contentType: 'application/json',
data: JSON.stringify({ columns: columns })
});
binders.Add(typeof(JqGridColumn), new JqGridColumnBinder());
您是否尝试过将JqGridColumn对象上的字段设置为属性(即,添加一个get&set),因为听起来模型绑定器找不到字段,而且仍然没有乐趣,恐怕…:(您是否尝试过使用WebApi控制器,使用WebApi控制器作为默认MVC绑定可能会以不同的方式处理模型绑定(我认为)取决于在FormCollection中发回的HTML元素。感谢您的参考。不幸的是,即使JqGridColumn变量更改为属性,它们仍然无法绑定。您可以尝试将其更改为列表而不是数组。我认为这对您获取正确的项数没有帮助。在off chanc上e为了让它可以工作,我尝试更改为列表,但仍然没有绑定:(即使进行了此更改,控制器仍能看到相同的表单帖子。谢谢:)不想使用自定义模型绑定器,因此JSON.stringify将获胜!