Предыдущий ролик Следующий ролик  

Видео урок: Using view models

Основы ASP.NET MVC 5

В этом видео мы познакомим вас с понятием "модель представления" и обсудим отличия этой модели от обычной модели MVC. Давайте еще раз посмотрим на класс CheckingAccount, который мы создали в начале этой главы. Мы уже видели, что эту модель можно использовать в рамках нескольких страниц для отображения значений свойств экземпляра модели или для построения формы, поля которой соответствуют конкретным свойствам. Совсем скоро мы будем сохранять экземпляры этого класса в таблицу базы данных. Свойства каждого экземпляра объекта будут в основном соответствовать столбцам этой таблицы.

Этот способ типичен для работы с моделями сохраняемых данных и аналогичен паттернам других MVC-фреймворков, например, Ruby on Rails. Возможно, вы уже заметили, что на главной панели навигации нашего приложения есть ссылки "Register" (Зарегистрироваться) и "Log in" (Войти в систему). На странице регистрации отображается форма с полями "Email" (Адрес электронной почты), "Password" (Пароль) и "Confirm password" (Подтвердить пароль). Благодаря магии Entity Framework при отправке этой формы действительно будет создана новая база данных, в которую добавится запись о новом пользователе.

В следующем видео мы поговорим о том, как все это работает, а пока я хочу подробнее рассмотреть представление Register: Views -> Account -> Register. Если в самом верху этого файла мы посмотрим на директиву model, то заметим, что она ссылается не на Account или Member, а на RegisterViewModel. RegisterViewModel - это модель, которая применяется только для работы с формой регистрации и которая никогда не будет храниться в базе данных.

Если нажать правую кнопку мыши и выбрать пункт "Перейти к определению" (Go to definition), то мы увидим, что эта модель определяется в файле AccountViewModels. В этом файле есть несколько моделей представлений, связанных с функциями текущего счета пользователя. Модель RegisterViewModel обладает свойствами Email, Password и ConfirmPassword. ConfirmPassword - это пример свойства, которое никогда не будет сохраняться в базе данных, что больше подходит не для базовой модели, а для модели представления.

LoginViewModel имеет свойства Email, Password и RememberMe, которое разрешает авторизацию на основе cookie. Итак, мы видим две разные модели со слегка отличающимися свойствами, каждая из которых связана с одной и той же записью базы данных, олицетворяющей пользователя. Чтобы увидеть, как модель представления способствует созданию этой записи, придется обратиться к методу Register класса AccountController. Рассмотрим тот метод Register, который обрабатывает форму.

Как видите, запись о пользователе будет строиться на основании экземпляра не класса RegisterViewModel, а класса под названием ApplicationUser, в котором электронный адрес из модели представления присваивается свойству UserName. Затем эти данные, а также пароль из модели представления, который перед сохранением в базе данных необходимо хэшировать, передаются в метод UserManager.CreateAsync. Кроме того, обратите внимание на тот факт, что единственный параметр в этом методе - это экземпляр класса RegisterViewModel.

Та же модель, которая используется для создания формы, передается и в качестве параметра этого метода, а также инкапсулирует все post-параметры этой формы. Теперь давайте изменим модель RegisterViewModel таким образом, чтобы в ней использовались также свойства FirstName, LastName и атрибуты. Скопировать эти свойства и атрибуты можно из модели CheckingAccount. Затем из представления Register можно скопировать эти элементы div и дважды их вставить, а также заменить свойства модели в этих вспомогательных методах на FirstName и LastName.

Теперь давайте построим решение и обновим страницу. Если вы увидите вот такой желтый экран смерти, то это говорит о проблемах со временем. Этого бы не произошло, если бы построение полностью завершилось. Но так как это все-таки случилось, мы просто обновим страницу еще раз и все станет на свои места. Теперь мы видим обновленную форму, в основе которой лежит обновленная модель представления. Созданная нами модель CheckingAccount подходила для отображения и валидации данных, связанных с записями, которые совсем недолго хранятся в базе данных. Мы только что увидели, как можно использовать несколько моделей представлений, связанных с одной и той же записью, для разных функций.

Перед тем как отправить эту форму, в следующем видео мы выполним еще несколько настроек, которые необходимы для того, чтобы с помощью Entity Framework связывать запись о пользователе с записью о текущем счете и сохранять эти данные в базе данных.