asp.net mvc использует viewmodel для создания и редактирования - PullRequest
0 голосов
/ 13 декабря 2011

хочу избавиться от ViewBag в моих представлениях, поэтому я провел небольшое исследование о моделях представления.Мне нравится идея использовать его для презентации, здесь нет вопросов.но я не понимаю, как лучше всего использовать viewmodels для обновления.

Прежде всего, почему бы мне не использовать свои EF-сущности с [MetadataType (typeof (User_Validation))]]?

public ActionResult Edit(User user) 
{
    ...
}

, где пользователь - EntityObject.

тогда, если я, однако, использую для него view-модели, возникает другой вопрос: здесь люди считают, что следует использовать вложенные модели представления, но здесь - другое мнение («Они не являются оболочками вокруг моделей предметной области», говорит он).Кто прав?

также, каков наилучший способ обновить объект в действии после POST (без использования tryupdatemodel, потому что здесь и не только, люди против такого подхода).Я пытался использовать ApplyCurrentValues, но если есть какая-то сложная логика обновления с отношениями «многие ко многим», например, я получаю некоторые огромные ошибки EF.Вот почему мне нужно вручную установить поля моего EntityObject, которые я получаю из БД со значениями, которые вступают в действие.Что-то вроде этого:

public ActionResult Edit(User user) 
{
    if (ModelState.IsValid)
    {
        var userToUpdate = usersRepository.Get(user.UserId);
        userToUpdate.Field1 = user.Field1;
        ...
        // save
    }
    ...
}

, где User - это EntityObject с классом проверки.

, поэтому, если я использую плоские видовые модели для получения значений из формы и AutoMapper для установки значений для моего объекта Entity, будет ли этосамый правильный способ работы с обновлениями или его можно автоматизировать еще больше?

1 Ответ

1 голос
/ 13 декабря 2011

Вы ответили сами в последнем абзаце.Я использую точно такой же подход в своем проекте MVC3 EF Code First.

Вот практика, которой я следую:

  1. Все классы сущностей объединены в одну папку "Entity".Вы также можете выбрать отдельный библиотечный проект.
  2. Каждый объект имеет соответствующий класс ViewModel с постфиксом Model (например, для объекта Profile есть класс ProfileModel).
  3. Для вложенных объектов существуют соответствующие вложенные классы ViewModel.
  4. AutoMapper используется для преобразования модели в сущность и наоборот.Здесь autopper заботится о вложенных объектах.В случае сложных обновлений, вместо того, чтобы полагаться на AutoMapper, я беру это дело в свои руки в контроллере.
  5. Работает безупречно с исправным разделением между моими объектами домена и моделями представления.
...