Вопрос по asp.net-mvc – MVC - привязка модели с несколькими объектами на одной странице

6

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

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

Есть идеи?

Это дубликат, я уверен. Создайте объект Model с открытыми свойствами для ваших объектов Customer и Address. Mark Dickinson

Ваш Ответ

3   ответа
1

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

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

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

-4

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

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

И мнение:

Customer name: <%= (ViewData["Customer"] as Customer).Name %>
Street: <%= (ViewData["Address"] as Address).Street %>
Используйте модель представления
Это передает несколько объектов в представление, они не являются моделями, вы не сможете получить доступ к их свойствам через представление Модель объекта.
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; }
    ...
}
@ eu-ge-ne - возможно. Это будет зависеть от того, как вы справляетесь с обновлением состояния модели при ошибках. Без написания тестов для кода трудно точно сказать, что должно быть сделано.
+ но возможно & quot; попробуй / поймай с UpdateModel & quot; лучше, чем эта "вложенная конструкция if (TryUpdateModel"?

Похожие вопросы