2017-03-06 4 views
1

私のコントローラでは、以下のようにCustomer viewmodelクラスを定義しました。要求がPOSTによって発行され、GETによって発行された場合に解決されない場合、MVCモデルバインディングが複雑なオブジェクトを正しく解決するのはなぜですか?

二つの性質のFirstName、LastNameのと3番目のプロパティの受注がWICHあり、注文のコレクションです

public class Customer 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public List<Order> Orders { get; set; } 
} 

public class Order 
{ 
    public int OrderId { get; set; } 
    public string OrderBy { get; set; } 
} 

public class TestController : Controller 
{ 

    public ActionResult TestCustomer1(Customer customer) 
    { 
     return Json(customer); 
    } 
} 

クライアントボタンをクリックして起動したときに、私はAJAX呼び出しによって、コントローラにデータを送信OnCustomerClick()

function OnCustomerClick() { 

    var complexObject = { 
     FirstName: 'Saroj', 
     LastName: 'K', 
     Orders: [{ OrderId: 1, OrderBy: 'Saroj' }, { OrderId: 2, OrderBy: 'Kumar' }] 
    }; 

    var obj = { customer: complexObject }; 
    var data2send = obj; 
    $.ajax({ 
     type: "POST", 
     url: 'TestCustomer1', 
     data: data2send, 
     success: function (arg) { //call successfull 
     }, 
     error: function (xhr) { 
      //error occurred 
     } 
    }); 
}; 

タイプで上記のようにアクションが呼び出されたときのポイントです。POSTコントローラのCustomerパラメータが要求されました。代わりに私がアクション:タイプ:GETパラメータオブジェクトは、プロパティをnullに設定してインスタンス化されます。

シリアライズされたオブジェクトを表す文字列は、2つのケースで全く同じです。最初のケースのaction:bodyリクエスト、2番目のケースのurlパラメータに文字列が渡される方法を変更するだけです。 POSTリクエストで

リクエストボディ 顧客%の5BFirstName%5D = Saroj &顧客%の5BLastName%5D = K &顧客%の5BOrders%の5Dの%5B0%5D%5BOrderId%5D = 1 &顧客%の5BOrders%の5D%以下5B0%5D%5BOrderBy%5D = Saroj &顧客%の5BOrders%の5Dの%5B1%5D GETにおける%5BOrderId%5D = 2 &顧客%5BOrdersの%の5Dの%5B1%5D%5BOrderBy%5D =クマール

クエリ文字列要求 /TestCustomer1?customer%5B FirstName%5D = Saroj &カスタマー%5BLastName%5D = K &お客様%5B発注者%5D%5B0%5D%5B注文ID5D = 1 &顧客%5B注文%5D%5B0%5D%5B注文%5D = Saroj &顧客%5B注文%5D%5B1%5D%5B注文番号%5D = 2 &カスタマー%5B発注者%5D%5B1%5D%5BOrderBy%5D = Kumar

誰にでも私がこの2つのケースでモデルバインディングの動作が変わる理由を教えてもらえますか?

+0

、それは 'のvar complexObject = {FirstNameとする必要があります。 OrderId:1、Orders [0] .OrderBy: 'Saroj'、Orders [1] .OrderId:2、Orders [1] .OrderBy: 'Kumar'} ' –

答えて

0

GET要求とPOST要求の違いは、POST本体がコンテンツタイプを持つことができるため、XMLとしてサーバー側で正しく解釈できるためです。 GETの場合、あなたが持っているのはクエリ文字列だけです。 URLにクエリ文字列として複合型を入れると正しく動作します。 例えば、クエリ文字列の配列は次のようになり得るために 'Saroj'、氏名: 'K'、注文[0] GETについて http://SomeHost/GetArray?TestData[0].a=1&Data[0].b=1&Data[1].a=2&Data[1].b=2&Data[2].a=3&Data[2].b=3

+0

ポイントはそうではありません。私は、ポストでサブミットされたときにモデルバインディングによって同じオブジェクトが解決される理由を知りたいだけで、同じオブジェクトがGet呼び出しのクエリーストリングパラメータとしてシリアル化されても解決されません。直列化されたオブジェクトに匹敵する文字列は、両方の場合で同じです。 –

+0

あなたの複雑なタイプに応じてあなたのURLを変更する場合は、私の答えを変更したと言ったので、正しく動作する必要があります... –

+0

私はあなたに同意することはできません。 POSTまたはGETのときにクエリ文字列にアタッチされたときに、同じ文字列が要求に投稿されますが、モデルバインディングの動作が同じではありません –

関連する問題