2.6. Модель представления

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

В 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. Результат работы этого примера:

Скачат исходник

Предыдущая глава

2.5. Представления

Следующая глава

3. Razor в .NET Core

О блоге

Программист, автор нескольких книг серии глазами хакера и просто блогер. Интересуюсь безопасностью, хотя хакером себя не считаю

Обратная связь

Без проблем вступаю в неразборчивые разговоры по e-mail. Стараюсь отвечать на письма всех читателей вне зависимости от страны проживания, вероисповедания, на русском или английском языке.

Пишите мне