7

JavaScript でオブジェクトの配列を構築し、それらを Ajax 経由でサーバーに送り返したい (私は jQuery を使用しています)

JavaScript オブジェクト配列は次のようになります。

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

次のように投稿します。

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

コントローラーアクションで、現在これを取得しています:

ここに画像の説明を入力

JqColumn投稿をバインドしたいという ac# オブジェクトがあり、次のようになります。

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の を登録していないため、が使用されます。しかし:JqGridColumnDefaultModelBinder

  • フィールドはバインドせず、パブリック プロパティのみをバインドします。

  • Array バインディングの予想される形式はcolumns[0].name、実際に投稿している間ですcolumns[0][name]

Name-Value-Pairs の代わりにcolumnsJSON形式で送信するだけで、問題は簡単に解決できます。

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

それでも、クラスを変更したくない場合は、ModelBinder特定の forJqGridColumnを登録して、フィールドと現在の 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

これは、JqGridColumn オブジェクトがフィールドではなくプロパティを必要とするためです。参照用にこの質問を参照してください。

ASP.net MVC - モデルバインディングはクラスフィールドを除外しますか?

于 2014-04-23T11:24:17.843 に答える