Подтвердить что ты не робот

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.
4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

Это на самом деле аналогичный ответ, как @DarinDimitrov's, но с прямым заключением.

Ответ 3

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

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

Ответ 4

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

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

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

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

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