MVC - привязка модели с несколькими объектами на одной странице

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

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

Есть идеи?

Ответы на вопрос(3)

Вы можете использовать ViewData для передачи нескольких моделей в представление.

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

И мнение:

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

Краткий ответ:

Build your ViewModel using the Domain objects that you want information about, Then use @model<ViewModel type> as the first line in your View.

Теперь вы строго набрали свой View и имеете доступ ко всем свойствам ОБА объектов Domain.

Если вы пытаетесь привязать к нескольким моделям при обратной передаче, вы должны попытаться использовать атрибут 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; }
    ...
}

ВАШ ОТВЕТ НА ВОПРОС