0

カスタムクラスを含む複雑なモデルがあるとしましょう:

    public class Car
{
    public Car() {}
    public Engine engine { get; set } // nested object
    public int FuelRemaining {get; set;}
    public int VehicleStatus {get; set;}
}

そして、次のような MVC 4 コントローラー:

    [HttpPost]
    public PartialViewResult ShowVehicleDetails(Car currentVehicle)
    {
        return PartialView(currentVehicle);
    }

このクラスのインスタンスを ajax ポストを使用してコントローラーに渡し、ビュー、部分ビューを返そうとしたり、オブジェクトを覗き見したりすると、engineのすべての値がnullになりますが、それ以外はすべて問題ありません。

POST のリクエスト ヘッダーのフォーム データに表示される JSON の例を次に示します。

{"engine":{"engineVIN":258736,"engineKM":160015,"EngineDesc":"EcoTech V8"},"FuelRemaining":90,"VehicleStatus":1}

注: FuelRemainingVehicleStatusの値は、コントローラーと結果ビューに問題なく表示されます。

なぜこれが当てはまるのか、これを回避する最善の方法を誰かが説明してもらえますか?

asp.net チームのこのブログ記事を見つけましたが、日付が 2010 年で、それ以上の最新情報を見つけることができませんでした。

4

2 に答える 2

2

オンラインで見つけた複雑なオブジェクトをコントローラーに渡すサンプルを詳しく見てみると、ajax 呼び出しを行うときにcontentTypeの設定を怠っていたことが明らかにわかりました。

具体的には、ワーキング コールは次のようになります。

        var jsonData = { "StartDate": selectedDate, "EndDate": selectedDate };

    $.ajax(
            {
                url: '@Url.Action("GetMyConcertTickets", "Main")',
                type: 'POST',
                data: JSON.stringify(jsonData),
                contentType: 'application/json',
                cache: false,
                success: function (data) {
                    populateMyConcertTicketsOnGrid(data);
                }
            });

"application/json"を渡すことをコントローラーに伝えない場合、"text/html"が期待されると思います。

于 2013-08-16T13:57:22.043 に答える
1

モデル バインディングからのオブジェクトは、ポストされた値でのみハイドレートできます。したがって、関連付けられたオブジェクトに対応する値が投稿にない場合Engine、そのプロパティはどれも入力されません。

既定のモデル バインディングは、アクション メソッドのパラメーター リストにある 1 つまたは複数のオブジェクトの新しいインスタンスを作成します。モデル バインディングで、たとえばデータベースから既存のオブジェクトを取得する場合は、カスタム モデル バインダーが必要になります。

于 2013-08-15T15:29:00.003 に答える