7

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

JavaScript 对象数组如下所示:

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

我把它发回来是这样的:

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

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

在此处输入图像描述

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

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

...效果很好,但我真的很想知道.Net MVC(正确)的方法!

4

3 回答 3

10

由于您没有ModelBinder为该JqGridColumn类型注册特定内容,因此DefaultModelBinder将使用 。但:

  • 它不会绑定字段,只会绑定公共属性。

  • Array 绑定的预期格式是columns[0].name在您实际发布columns[0][name].

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

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

然而,如果你不想改变你的类,你可以注册一个ModelBinder特定的 forJqGridColumn并让它与 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());
于 2014-04-24T15:00:55.277 回答
0

尝试使用传统的 : true 设置和 dataType: json 回发

$.ajax({
    url: '/MyController/MyAction',
    method: 'POST',
    traditional: true,
    dataType: json
    data: columns ,            
    sucess: function () { alert('Success'); }
});
于 2014-04-23T12:20:26.947 回答
0

这是因为您的 JqGridColumn 对象需要属性,而不是字段。请参阅此问题以供参考:

ASP.net MVC - 模型绑定不包括类字段?

于 2014-04-23T11:24:17.843 回答