2009-07-03 13 views
6

ページ上の複数のエンティティから情報を返すシナリオでモデルバインディングを使用する方法を知りたいですか?MVC - 同じページ上の複数のエンティティとのモデルバインディング

私は、2つの別々のエンティティ、つまりCustomer + Addressからのフィールドの組み合わせを表示したいと考えています。私は自分のモデルにMicrosoftのDAABとカスタムビジネスエンティティを使用しています。

アイデア?

+1

これは重複しています。 CustomerオブジェクトとAddressオブジェクトのパブリックプロパティを持つModelオブジェクトを作成します。 –

答えて

20

あなたがポストバックで複数のモデルにバインドしようとしている場合は、bind属性を使用して、引数の各モデルに使用接頭辞を指定してみてください。モデル要素に別々のプレフィックスを使用できない場合がありますが、複数のTryUpdateModelとモデルをパラメータに入れるのではなく、ホワイトリストを分離する方が簡単な場合があります。

public ActionResult Update([Bind(Prefix="Customer")]Customer customer, 
          [Bind(Prefix="Address")]Address address) 
{ 
    ... 
} 

これはあなたのようなビューモデルを持っていると仮定します:

public class CustomerAddressModel 
{ 
    public Customer Customer { get; set; } 
    public Address Address { get; set; } 
} 

、それは同様の参照:

<%= Html.TextBox("Customer.Name") %> 
... 
<%= Html.TextBox("Address.Street") %> 

または、TryUpdateModel、

public ActionResult Update(int id) 
{ 
    var customer = db.Customers.Where(c => c.ID == id).Single(); 

    var whitelist = new string[] { "name", "company", ... }; 
    if (TryUpdateModel(customer, whitelist)) 
    { 
     var addressWhitelist = new string[] { "street", "city", ... }; 
     if (TryUpdateModel(customer.Address, addressWhitelist)) 
     { 
      ... 
     } 
    } 

}

を使用して

この場合、モデルには、更新しようとしている2つの異なるモデルのフィールドだけが含まれている場合があります。

public class CustomerAddressModel 
{ 
    public string Name { get; set; } 
    public string Company { get; set; } 
    public string Street { get; set; } 
    ... 
} 
+0

+を使用してください。ただし、「UpdateModelで試してみてください」がこの「ネストされたif(TryUpdateModel」の構築? –

+0

@ eu-ge-ne - maybe)よりも優れています。実際にコードのテストを書くことなく、何をすべきかを正確に伝えるのは難しいです。 – tvanfosson

-4

ViewDataを使用すると、複数のモデルをビューに渡すことができます。

SomeControllerMethod() 
{ 
    ... 
    ViewData["Customer"] = myCustomer; 
    ViewData["Address"] = myAddress; 
} 

とビュー:

Customer name: <%= (ViewData["Customer"] as Customer).Name %> 
Street: <%= (ViewData["Address"] as Address).Street %> 
+0

これはビューに複数のオブジェクトを渡しますが、それらはモデルではなく、ビューModelオブジェクトを通じてプロパティにアクセスすることはできません。 –

+0

ビューモデル –

1

短い答えは:

  1. は、その後、あなたのビューの最初の行として@model<ViewModel type>を使用あなたはについての情報が欲しいドメインオブジェクトを使用して、あなたのViewModelを作成します。

これで、強くビューをタイプし、ドメインオブジェクトの両方のすべてのプロパティにアクセスできるようになりました。

関連する問題