ASP.net MVC - одна ViewModel на просмотр или на действие?
Лучше ли иметь один ViewModel для одного представления или один на действие контроллера?
Пример:
public ProjectController : Controller
{
public ActionResult Edit(int id)
{
var project = ...;
return View(new ProjectEditViewModel(project));
}
[HttpPost]
public ActionResult Edit(ProjectEditViewModel model)
{
}
**OR**
[HttpPost]
public ActionResult Edit(Project model)
{
}
[HttpPost]
public ActionResult Edit(ProjectEditPostViewModel model)
{
}
}
Вот три варианта, какой лучше?
- Используйте ту же ViewModel для моих действий POST/GET.
- Используйте ViewModel для моего действия GET и мою модель домена для моего действия POST.
- Используйте другую ViewModel для GET и другую ViewModel для POST.
4 ответа
Использование другой модели представления для действий GET и POST - лучший и наиболее гибкий дизайн. Но использование одной и той же модели представления для действий GET и POST также работает в 90% случаев, и это хороший дизайн. Так что, если в вашем сценарии работает та же модель представления, не стесняйтесь использовать ее следующим образом.
В случае, когда для действий GET и POST используются разные модели представлений, между этими классами все еще существует некоторая связь: наследование или композиция.
Правильный ответ
Ни то, ни другое. Там нет серебряной пули и не должно быть.
Поэтому правильный ответ: используйте столько моделей представлений, сколько требуется вашему процессу пользовательского интерфейса. Это независимо от представлений или действий контроллера.
Иногда действие требует взгляда, другой вид. Но не следуйте строгим правилам, которые могут помешать вашему развитию. Просмотр моделей будет естественным, когда вы разрабатываете свое приложение. И должен. В противном случае вы можете получить необоснованные представления, основанные на каких-то руководящих принципах, которые вы установили в камне.
На самом деле это ответ, аналогичный @DarinDimitrov, но с прямым выводом.
Используйте другую модель для получения входных параметров в действии Post (я даже не называю это ViewModel в этом случае), чем для передачи выходных параметров в представление.
Таким образом, вы можете настроить, какие именно входные параметры вы принимаете.
Я придерживаюсь этого подхода для основных форм:
- Одна модель просмотра для GET
- Одна модель просмотра для POST
Модель GET наследует модель POST.
Я часто буду передавать объект предметной области конструктору модели GET и буду делать с ним 2 вещи:
- Заполните свойства модели POST данными из объекта домена.
- Инкапсулируйте объект домена как локальную переменную в модели GET. Я использую это для отображения некоторых (только для чтения) данных из объекта домена. Экономит немного усилий. Некоторые люди скажут вам не делать этого.