Рекомендации для MVC .. Пример привязки ViewModel с использованием интерфейсов - PullRequest
12 голосов
/ 27 октября 2011

Я новичок в ASP.NET MVC 3.0 и пытаюсь создать приложение, используя дизайн MVC ViewModel ..

Мне было интересно, каковы лучшие практики по обновлению контроллеров для ViewModels, и у меня есть несколько вопросов ниже. Это мое понимание до сих пор (что может быть неправильно) ..

  • Мы создаем модели.
  • Создайте ViewModels, создав новый класс и объявив атрибуты с тем же именем и типом, что и у классов базовой модели (включая поля идентификаторов базовых моделей, которые вы хотите обновить позже ... и классы никак не связаны).
  • Создайте репозиторий для каждой из базовых моделей (чтобы найти и сохранить данные и т. Д.).
  • Создайте действие Controller для каждой из моделей ViewModel (которые обращаются к репозиториям базовых классов для получения значений и помещают эти значения в ViewModel, а затем передают ViewModel в представление ViewModels).
  • Создание видов из моделей ViewModel (виды ViewModel)
  • В методе Обновление контроллера ViewModel (POST) получите обновленный объект ViewModel и преобразуйте его в объекты базовой модели (может быть, используйте Automapper?), А затем сохраните объекты базовой модели обратно, используя их репозитории, и примените привязку следующим образом? "TryUpdate <'IPerson> (person)", "TryUpdate <' IPlace> (place);" (это выглядит неправильно, цель состоит в том, чтобы поместить значения обратно в базовые классы из ViewModel, применить привязку, сохранить базовые модели обратно с помощью репозиториев! .. Похоже, что эти репозитории не используются .. Вместо TryUpdate <'IPerson> (person); я ожидал бы увидеть что-то вроде этого: person.Save (IPerson) .. где «person содержит значения», «.Save - это хранилище» и «IPerson содержит атрибуты привязки, используемые для привязки»? .. Не уверен, что это правильно ..

До сих пор я создал ViewModels, создав новый класс и добавив атрибуты из разных базовых моделей с одинаковыми именами. На данный момент у меня есть следующие вопросы:

Q1: У каждого ViewModel есть собственный контроллер и доступ к каждому из классов репозитория базовых моделей для получения его значений?

Q2: в ViewModel следует включить поле идентификатора всех базовых моделей, из которых вы используете атрибуты, учитывая, что вы можете отправить POST обновление через контроллер ViewModels в хранилище базовых моделей (требуется идентификатор) значения)?

В3: Как бы вы связали атрибуты, используя интерфейс для привязки модели в контроллере, используя хранилище для сохранения.

Мне не удалось найти учебник или ресурс, который объясняет все в пошаговом примере. Полный ответ будет следующий пример:

  • 2х простых моделей, 1x простой viewModel, 1x интерфейс для привязки, 1x простой контроллер, использующий класс интерфейса для привязки при обновлении, 1x репозиторий .. т.е.

// Model1

public class Person
{
  int PersonID {get;set;}
  string FirstName {get;set;}
  string LastName {get;set;}
  DateTime DOB {get;set}
}

// Model2

public class Place
{
  int PlaceID {get;set;}
  string Description {get;set;}
  string AreaType {get;set;}
  string PostCode {get;set;}
}

// ViewModel (содержит атрибуты из моделей)

publc class ViewModel
{
  //Person attributes
  int PersonID {get;set;}
  string FirstName {get;set;}
  string LastName {get;set;}

  //Place attributes
  int PlaceID {get;set;}
  string Description {get;set;}
  string AreaType {get;set;}

  //other attributes
  string someOtherAttributeForDisplay {get;set}
}

// Интерфейс Model1 (для привязки к модели)

public interface IPerson
{
  string FirstName {get;set;}
}

// Интерфейс Model2 (для привязки к модели)

public interface IPlace
{
  string Description {get;set;}
  string AreaType {get;set}
}

// ViewModelController

{
  //What goes here?
}

// Репозиторий

{
  //what goes here?
}

1 Ответ

6 голосов
/ 27 октября 2011

Я думаю, вы, возможно, слишком усложнили очень простую концепцию.

Прежде всего, некоторые общие правила:

  • Не используйте TryUpdateModel. Просто не надо.
  • По тем же причинам не используйте никакие "автоматические" сопоставители для сопоставления из вашей модели представления с вашими сущностями. Автоматическое сопоставление в обратном направлении (от объекта к представлению модели) отлично.

Использование интерфейсов не требуется.

Предполагается, что модели представлений - это очень простые классы, содержащие только ту информацию, которая вам нужна для просмотра. Если ваше представление POST отличается от отображаемой информации, просто создайте другую модель представления для POST.

Мы используем соглашение об именах {Controller} {Action} Model для наших моделей представлений. Таким образом, для действия с именем «List» на контроллере «Post» у нас будет модель с именем «PostListModel».

Наконец, посмотрите мой ответ здесь Реальный пример TryUpdateModel, ASP .NET MVC 3

...