javascript – Asp.Net MVC 4自动绑定表单中对象数组的模型

前端之家收集整理的这篇文章主要介绍了javascript – Asp.Net MVC 4自动绑定表单中对象数组的模型前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在 JavaScript中构建了一个对象数组,并希望通过Ajax将它们发布回服务器(我使用jQuery)

JavaScript对象数组如下所示:

var columns = [
    { name: 'col 1',source: 'whatever',hidden: false,width: 50 },...
];

我发布回来像这样:

$.post('/MyController/MyAction',{ 'columns': columns });

在控制器操作我目前得到这个:

我有一个名为JqColumn的c#对象,我想将帖子绑定到,它看起来像这样:

public class JqGridColumn
{
    public string name;
    public string source;
    public int width;
    public bool hidden;
}

所以我认为在JqGridColumn []列类型的控制器操作中添加一个参数会自动绑定发布的数据,但它不会(它生成一个数组,具有正确数量的元素,但数组中的每个项目都是空白的值)

谁能告诉我我做错了什么?谢谢!

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;
    }

…工作正常,但我真的很想知道.Net MVC(正确)方法

解决方法

由于您没有为JqGridColumn类型注册特定的ModelBinder,因此将使用DefaultModelBinder.但:

>它不会绑定Fields,只会绑定公共属性.
>数组绑定的预期格式是列[0] .name,而您实际上是在发布列[0] [名称].

如果您只是以JSON格式而不是Name-Value-Pairs发送列,则可以轻松解决问题:

$.ajax({
    url: '/MyController/MyAction',method: 'POST',contentType: 'application/json',data: JSON.stringify({ columns: columns })
});

但是,如果您不想更改类,可以注册一个特定于JqGridColumn的ModelBinder,并使其与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
        };
    }
}

然后在App_Start / ModelBindingConfig.cs中注册它:

binders.Add(typeof(JqGridColumn),new JqGridColumnBinder());
原文链接:https://www.f2er.com/js/159790.html

猜你在找的JavaScript相关文章