Определение моделей представления для MVC / MVP

Короткий вопрос - как вы определяете свои модели зрения?

Вот некоторые из вариантов:

  1. Передайте фактическую модель в представление.
  2. Создайте модель представления со ссылкой на модель (например, Model.Product).
  3. Создайте модель представления со свойствами, необходимыми для модели, и установите свойства для модели.
  4. Наверное, намного больше.

Все со своими достоинствами и недостатками.

Какой у вас опыт - хороший и плохой? И вы используете ту же модель для GET/POST?

Спасибо за ваш вклад!

3 ответа

Решение

В основном - это все о разделении обязанностей.

Чем больше вы их разделяете - тем более многословно, сложно, но легче понять.


Модель:

public class foo{
    string Name{get;set}
    Bar Bar {get;set;}
    string SomethingThatIsUneccessaryInViews {get;set;}
}

public class bar{
    string Name {get;set;}
}

public class fizz{
    string Name{get;set;}
}

Ведущий (я признаю - до сих пор не получил полное представление о MVP):

public someSpecificViewPresenter{
    fizz fizz{get;set;}
    foo foo{get;set;}
    necessaryThingsForWhatever[] necessaryThingsForWhatever{get;set;}
    public void someLogicIfNeeded(){...}        
}

Волшебное сопоставление и выравнивание объекта object2, конфигурация метаданных модели viewmodel идет здесь...

ViewModel (NB => POCOS только с контейнерными опорами. Никакой логики здесь не должно быть.):

public class fooViewModel{
    string Name {get;set;}
    string BarName {get;set;}
}

public class fizzViewModel{
    string Name {get;set;}
}

public class someSpecificView{
    fooViewModel foo {get;set;}
    fizzViewModel fizz {get;set;}
    whateverViewModel whatever {get;set;}
}

и здесь идет "счастливый конец"...

<use viewdata="someSpecificView m" />

<p>
Our foo:<br/>
${Html.DisplayFor(x=>x.foo)}
</p>

<p>
Our fizz:<br/>
${Html.DisplayFor(x=>x.fizz)}
</p>

${Html.UberPaging(m.whatever.Paging)}

И да, я использую ту же модель для GET/POST. Смотрите это для более подробной информации почему / если.


Но в последнее время - я ищу другие решения. Гул CQRS попался на глаза.

Я взял шаблоны T4 из SubSonic 3. Они были изменены, и я добавил несколько новых. Я могу запустить одну из них, и она генерирует 3 отдельные модели представления для каждой таблицы. Тогда я могу изменить по мере необходимости.

Почему три?

  1. FormModel - содержит данные, необходимые для отображения в форме для редактирования или создания. Внешние ключи преобразуются в списки выбора. Поля DateTime разделяются на компоненты даты и времени.

  2. PostModel - это объект, возвращаемый из формы Post. DropDownLists публикуются как Int или эквивалентный тип. Только необходимые члены в модели.

  3. DisplayModel - используется для нередактирования отображения данных.

Я всегда генерировал их в подпапке с именем Generated. Когда я настраиваю их вручную, я перемещаю их в папку "Модели". Он не полностью автоматизирует процесс, но генерирует много кода, который я мог бы создать вручную.

В моих проектах это действительно микс.

Если я хочу отобразить форму с подробной информацией о клиенте X, я просто передаю объект клиента DAL своему представлению. На самом деле бесполезно создавать для него отдельную ViewModel, сопоставлять все его свойства и затем отображать их. Это трата времени, имхо.

Хотя иногда модели немного сложнее. Они являются результатом нескольких запросов, к ним добавлены некоторые данные, поэтому в этих случаях я создаю пользовательскую модель представления и добавляю в нее необходимые данные из моей модели. В вашем случае это будет вариант 2, а иногда и 3. Я предпочитаю это вместо передачи моей модели и необходимости добавления дополнительных 10 элементов в мои ViewData.

Другие вопросы по тегам