Определение моделей представления для MVC / MVP
Короткий вопрос - как вы определяете свои модели зрения?
Вот некоторые из вариантов:
- Передайте фактическую модель в представление.
- Создайте модель представления со ссылкой на модель (например, Model.Product).
- Создайте модель представления со свойствами, необходимыми для модели, и установите свойства для модели.
- Наверное, намного больше.
Все со своими достоинствами и недостатками.
Какой у вас опыт - хороший и плохой? И вы используете ту же модель для 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 отдельные модели представления для каждой таблицы. Тогда я могу изменить по мере необходимости.
Почему три?
FormModel - содержит данные, необходимые для отображения в форме для редактирования или создания. Внешние ключи преобразуются в списки выбора. Поля DateTime разделяются на компоненты даты и времени.
PostModel - это объект, возвращаемый из формы Post. DropDownLists публикуются как Int или эквивалентный тип. Только необходимые члены в модели.
DisplayModel - используется для нередактирования отображения данных.
Я всегда генерировал их в подпапке с именем Generated. Когда я настраиваю их вручную, я перемещаю их в папку "Модели". Он не полностью автоматизирует процесс, но генерирует много кода, который я мог бы создать вручную.
В моих проектах это действительно микс.
Если я хочу отобразить форму с подробной информацией о клиенте X, я просто передаю объект клиента DAL своему представлению. На самом деле бесполезно создавать для него отдельную ViewModel, сопоставлять все его свойства и затем отображать их. Это трата времени, имхо.
Хотя иногда модели немного сложнее. Они являются результатом нескольких запросов, к ним добавлены некоторые данные, поэтому в этих случаях я создаю пользовательскую модель представления и добавляю в нее необходимые данные из моей модели. В вашем случае это будет вариант 2, а иногда и 3. Я предпочитаю это вместо передачи моей модели и необходимости добавления дополнительных 10 элементов в мои ViewData.