Jim*_*mbo 7 javascript arrays asp.net-mvc form-post model-binding
我在JavaScript中构建了一个对象数组,并希望通过Ajax将它们发布回服务器(我使用jQuery)
JavaScript对象数组如下所示:
var columns = [
{ name: 'col 1', source: 'whatever', hidden: false, width: 50 },
...
];
Run Code Online (Sandbox Code Playgroud)
我发布回来像这样:
$.post('/MyController/MyAction', { 'columns': columns });
Run Code Online (Sandbox Code Playgroud)
在控制器操作我目前得到这个:
我有一个ac#object叫JqColumn
我想绑定帖子,它看起来像这样:
public class JqGridColumn
{
public string name;
public string source;
public int width;
public bool hidden;
}
Run Code Online (Sandbox Code Playgroud)
所以我认为在类型的控制器动作中添加一个参数JqGridColumn[] columns
会自动绑定发布的数据,但它不会(它生成一个数组,具有正确的元素数,但数组中的每个项都有空值)
谁能告诉我我做错了什么?谢谢!
UPDATE
目前,我手动绑定控制器操作中的项目如下:
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;
}
Run Code Online (Sandbox Code Playgroud)
...工作正常,但我真的很想知道.Net MVC(正确)方法!
hai*_*770 10
由于您未注册ModelBinder
该JqGridColumn
类型的特定内容,因此DefaultModelBinder
将使用该类型.但:
它不会绑定Fields,只会绑定公共属性.
数组绑定的预期格式是columns[0].name
在您实际发布时columns[0][name]
.
这个问题可以迎刃而解,如果你只是把你columns
的JSON格式而不是名称-值对:
$.ajax({
url: '/MyController/MyAction',
method: 'POST',
contentType: 'application/json',
data: JSON.stringify({ columns: columns })
});
Run Code Online (Sandbox Code Playgroud)
但是,如果你不喜欢改变你的类,你可以注册一个ModelBinder
特定的,JqGridColumn
并使它甚至可以使用Fields和当前的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
};
}
}
Run Code Online (Sandbox Code Playgroud)
然后在App_Start/ModelBindingConfig.cs中注册它:
binders.Add(typeof(JqGridColumn), new JqGridColumnBinder());
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
9849 次 |
最近记录: |