ASP.net MVC - одна ViewModel на просмотр или на действие? - PullRequest
14 голосов
/ 13 сентября 2011

Лучше ли иметь одну 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)
    {
    }
}

Вот три варианта, что лучше?

  1. Используйте ту же ViewModel для моих действий POST / GET.
  2. Используйте ViewModel для моего действия GET и мою модель домена для моего действия POST.
  3. Используйте другую ViewModelдля GET и другой ViewModel для POST.

Ответы [ 4 ]

10 голосов
/ 13 сентября 2011

Использование другой модели представления для действий GET и POST - лучший и наиболее гибкий дизайн.Но использование одной и той же модели представления для действий GET и POST также работает в 90% случаев, и это хороший дизайн.Поэтому, если в вашем сценарии работает одна и та же модель представления, не стесняйтесь повторно использовать ее следующим образом.

В случае, когда для действий GET и POST используются разные модели представления, между этими классами все еще существует некоторая связь: наследство или состав.

3 голосов
/ 26 октября 2011

Правильный ответ

Ни .Там нет серебряной пули и не должно быть.

Поэтому правильный ответ таков: используйте столько моделей представлений, сколько требует ваш пользовательский интерфейс .Это независимо от представлений или действий контроллера.

Иногда действие требует представления, а другое - представления.Но не следуйте строгим правилам, которые могут помешать вашему развитию.Просмотр моделей будет естественным, когда вы разрабатываете свое приложение.И должен.В противном случае вы можете получить необоснованные представления, основанные на каком-то указании , которое вы установили в камне.

На самом деле это ответ, аналогичный @ DarinDimitrov, но с прямым выводом.

1 голос
/ 13 сентября 2011

Используйте другую модель для получения входных параметров в действии Post (я даже не называю это ViewModel в этом случае), чем для передачи выходных параметров в представление.

Таким образом, вы можете настроить, какие именно входные параметры вы принимаете.

0 голосов
/ 05 июля 2015

Я придерживаюсь этого подхода для базовых форм:

  • Одна модель представления для GET
  • Одна модель представления для POST

Модель GETнаследует модель POST.

Я часто передаю объект домена в конструктор модели GET и делаю с ним 2 вещи:

  1. Заполняем свойства модели POST данными из доменаobject.
  2. Инкапсулировать объект домена как локальную переменную в модели GET.Я использую это для отображения некоторых (только для чтения) данных из объекта домена.Экономит немного усилий.Некоторые люди скажут вам не делать этого.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...