Javascript NETMVC4自动从表单post中的对象数组绑定模型

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

我已经用JavaScript构建了一个对象数组,并希望通过Ajax将它们发布回服务器(Im使用jQuery)

JavaScript对象数组如下所示:

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]。当您实际发布
    列[0][name]
    时,name

如果您只需以JSON格式发送
列,而不是名称-值对,那么问题很容易解决:

$.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将获胜!