2009-07-03 7 views
6

Мне интересно, как использовать привязку модели в сценарии, где я возвращаю информацию из нескольких объектов на странице?MVC - привязка модели с несколькими объектами на той же странице

Я хочу отобразить комбинацию полей из двух отдельных объектов, то есть Customer + Address. Я использую Microsoft DAAB и пользовательские бизнес-объекты для моей модели.

Любые идеи?

+1

Это дубликат, я уверен. Создайте объект Model с общедоступными свойствами для объектов Customer и Address. –

ответ

20

Если вы пытаетесь связать с нескольких моделей на постбэк, вы должны попробовать использовать атрибут Bind и указать префиксы, используемые для каждой модели в ваших аргументах. В некоторых сценариях, где вы не сможете использовать отдельные префиксы для своих элементов модели, вам может показаться, что это проще сделать с несколькими TryUpdateModel и отдельными белыми списками вместо того, чтобы помещать модели в параметры.

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

Это предположить, что у вас есть ViewModel как:

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; } 
    ... 
} 
+0

+, но, возможно, «try/catch with UpdateModel» лучше, чем эта «вложенная if (TryUpdateModel» конструкция? –

+0

@ eu-ge-ne - возможно. Это будет зависеть от того, как вы обрабатываете обновление состояния модели на ошибках. Без написания тестов для кода трудно точно сказать, что делать. – 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. Создайте свой ViewModel с использованием объектов домена, который вы хотите получить информацию о,
  2. Затем используйте @model<ViewModel type> в качестве первой линии с вашей точки зрения.

Теперь вы строго указали свой вид и получили доступ ко всем свойствам ОБОИХ объектов домена.

Смежные вопросы