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.
Ответы
Ответ 1
Использование другой модели представления для действий GET и POST - лучший и самый гибкий дизайн. Но использование одной и той же модели представления для действий GET и POST также работает в 90% случаев, и это прекрасный дизайн. Поэтому, если использование одной и той же модели представления работает в вашем сценарии, не стесняйтесь использовать ее так.
В случае, когда для действий GET и POST используются разные модели представлений, все еще существует некоторая связь между этими классами: наследование или состав.
Ответ 2
Правильный ответ
Ни. Там нет серебряной пули, и ее не должно быть.
Правильный ответ: использовать столько моделей просмотра, сколько требуется для процесса пользовательского интерфейса. Это независимо от представлений или действий контроллера.
Иногда действие требует просмотра, другого - вида. Но не следуйте строгим правилам, которые помешали бы вашему развитию. Просмотр моделей придет, естественно, при разработке вашего приложения. И должен. В противном случае у вас могут возникнуть необоснованные взгляды, основанные на некоторых рекомендациях, которые вы установили в камне.
Это на самом деле аналогичный ответ, как @DarinDimitrov's, но с прямым заключением.
Ответ 3
Использовать другую модель для получения входных параметров в Post action (я даже не называю это ViewModel в этом случае), чем передавать выходные параметры в представление.
Таким образом вы можете точно настроить, какие входные параметры вы принимаете.
Ответ 4
Я следую этому подходу для базовых форм:
- Одна модель просмотра для GET
- Одна модель представления для POST
Модель GET наследует модель POST.
Я часто передаю объект домена в конструктор модели GET и делаю с ним 2 вещи:
- Заполните свойства модели POST данными из объекта домена.
- Инкапсулировать объект домена как локальную переменную в модели GET. Я использую это для отображения некоторых (только для чтения) данных из объекта домена. Экономит немного усилий. Некоторые люди скажут вам не делать этого.