В веб программировании выделяют бизнес модели и модели представления. Мы уже немного затрагивали вопрос бизнес моделей, в которых нужно реализовывать бизнес логику, но эту тему мы пока еще отложим. Нам нужно чуть больше познакомиться с представлениями и их моделями.
В MVC представления не должны ничего знать о бизнес модели и бизнес модель ничего не должна знать о том, как и кем будут отображаться данные. Вся коммуникация должна происходить через контроллер, который единственный знает о том и другом.
Но как представление может получить доступ к данным? Оно же не может вызвать метод бизнес логики и увидеть ответ, вместо этого представления должны получать от контроллера все необходимые данные в виде View Model – моделей представления. Это не какой-то код с логикой – это могут быть классы, которые описывают только модель данных и могут еще заниматься проверкой данных на корректность – это и все. В данном случае слово модель (моделирование). Если под Бизнес Моделью часто понимают не только данные, но и логику, то тут чисто данные. Это какие-то классы, которые содержат данные для отображения в представлении.
В Visual Studio в окне Solution Explorer проверяем, есть ли у нас тут папка Model. Если ее не существует, то кликаем правой кнопкой мыши по имени проекта и выбираем Add -> Add Folder. Назовем папку Model или я еще иногда называю ее ViewModel, чтобы она реально отражала смысл происходящего. В Web проекте у меня никогда не бывает бизнес модели, поэтому можно и просто Model, потому что если это Web проект, то тут может быть только то, что касается Web, а не логики выполнения сайта.
Теперь в папке модели создаем файл Person.cs. Для этого щелкаем правой кнопкой по папке Model и здесь выбираем Add -> New File. В появившемся окне выбираем раздел General и потом Empty Class. Внизу окна пишем Person.cs и нажимаем ОК.
Напоминаю, что в принципе, не имеет значение, какой тип файла вы выберете, главное — это расширение файла, и его содержимое. А вот содержимым мы сейчас и займемся.
Этот файл будет специально для модели и судя по названию файла здесь я хочу создать класс с именем Person и несколькими полями, для примера у нашего человека будет три свойства имя, фамилия и возраст:
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; namespace MyWebSite.Model { public class Person { public string FirstName { get; set; } public string LastName { get; set; } public int Age { get; set; } } }
У этой модели только свойства, потому что ее идея только создать объект в памяти, через контроллер передаст данные в представление.
Идем в контроллер, здесь создаем объект класса Person и чтобы передать его представлению просто передаем его в качестве параметра методу View:
public IActionResult Index() { Person person = new Person() { FirstName = "Mikhail", LastName = "Flenov", Age = 42 }; return View(person); }
Пока мы использовали View без параметров, при котором фреймворк просто искал файл с таким же именем, как и имя метода и отображал его. Я упоминал, что есть еще версия, когда в качестве параметра передается имя представления, если нужно отобразить файл, имя которого отличается от имени метода.
В этой главе познакомимся с еще двумя версиями этого метода:
View(object model) – в качестве параметра передается объект подели представления. При этом фреймворк будет искать файл представления с таким же именем, как и имя метода.
View(string viewName , object model) – первый параметр это имя файла представления, а второй параметр – объект модели.
Запомнить просто, если используется представление с таким же, как имя метода, то модель – это первый и единственный параметр. Если нужно указать имя представления явно, то модель будет во втором параметре.
Теперь осталось увидеть, как в представлении можно использовать модель. Итак, смотрим на обновленный код представления:
@* For more information on enabling MVC for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860 *@ @model MyWebSite.Model.Person @{ } <h1>Hello</h1> <p>First Name: @Model.FirstName</p> <p>Last Name: @Model.LastName</p> <p>Age: @Model.Age
Самое интересное тут начинается со строки:
@model MyWebSite.Model.Person
Эта строка задает типа модели, которую мы ожидаем от контроллера. В определении метода View параметр модели имеет тип Object, а через этот тип можно передать совершенно любой тип данных в .NET, ведь все происходит именно от класса Object. Но во View нам нужно более точно указать, какого именно класса будут данные, чтобы фреймворк знал, какие именно свойства есть у модели, и мы могли проще к ним обращаться.
Теперь, когда мы хотим вывести на экран значение какого-то свойства на страницу, достаточно указать @Model и после свойство модели. Например, имя мы выводим так? @Model.FirstName . При отображении представления фреймворк подставит вместо @Model объект модели, который передается в качестве параметра и таким образом мы показываем на странице имя.
Запустите пример и в браузере переходим по адресу: localhost:5001/razortest/index. Результат работы этого примера: