2009-07-03 30 views
6

我想知道如何使用模型綁定的情況下,我從一個頁面上的多個實體返回信息?MVC - 模型綁定與多個實體在同一頁

我想顯示來自兩個獨立實體(即客戶+地址)的字段組合。我正在爲我的模型使用Microsoft的DAAB和自定義業務實體。

任何想法?

+1

這是一個重複的,我敢肯定。爲您的客戶和地址對象創建具有公共屬性的模型對象。 – 2009-07-03 14:20:33

回答

20

如果你想綁定到回傳多種模式,你應該儘量使用綁定屬性,並指定用於你的參數各型號的前綴。在某些情況下 - 您可能無法爲模型元素使用單獨的前綴 - 您可能會發現使用多個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)) 
     { 
      ... 
     } 
    } 

}

在這種情況下,您的模型可能只包含您嘗試更新的兩個不同模型中的字段。

public class CustomerAddressModel 
{ 
    public string Name { get; set; } 
    public string Company { get; set; } 
    public string Street { get; set; } 
    ... 
} 
-4

您可以使用ViewData將多個模型傳遞給視圖。

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

和視圖:

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

這會將多個對象傳遞給視圖,它們不是模型,您將無法通過視圖模型對象訪問其屬性。 – 2009-07-03 14:27:44

+0

使用視圖模型 – 2013-08-20 01:52:02

1

簡短的回答是:

  1. 使用您想了解有關信息的域對象,建立你的視圖模型
  2. 然後用@model<ViewModel type>作爲視圖中的第一道防線。

您現在強烈鍵入您的視圖,並有權訪問域對象的所有屬性。