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

Введение в представления

Последнее обновление: 22.03.2022

Обычно при обращении к веб-приложению пользователь ожидает получить веб-страницу с какими-нибудь данными. В MVC для этого, как правило, используются представления, которые определяют внешний вид приложения и на основе которых потом формируется веб-страница. В ASP.NET MVC Core представления - это файлы с расширением cshtml, которые содержат код пользовательского интерфейса в основном на языке html, а также конструкции Razor - специального движка представлений, который позволяет переходить от кода html к коду на языке C#.

Для хранения представлений в проекте ASP.NET Core предназначена папка Views. Например, если мы возьмем проект по типу ASP.NET Core Web App (Model-View-Controller), то мы увидим, что он содержит ряд представлений:

Представления в проекте ASP.NET Core MVC на C#

Подобный проект для хранения представлений в папке Views определяет некоторую структуру:

  • Во-первых, как правило, для каждого контроллера в проекте создается подкаталог в папке Views, который называется по имени контроллера и который хранит представления, используемые методами данного контроллера. Так, по умолчанию имеется контроллер HomeController и для него в папке Views есть подкаталог Home с представлениями для методов контроллера HomeController - в данном случае это файлы Index.cshtml и Privacy.cshtml.

  • Также здесь есть папка Shared, которая хранит общие представления для всех контроллеров. По умолчанию это файлы _Layout.cshtml (используется в качестве мастер-страницы), Error.cshtml (использутся для отображения ошибок) и _ValidationScripsPartial.cshtml (частичное представление, которое подключает скрипты валидации формы).

  • И в корне каталога Views также можно найти два файла _ViewImports.cshtml и _ViewStart.cshtml. Эти файлы содержат код, который автоматически добавляется ко всем представлениям. _ViewImports.cshtml устанавливает некоторые общие для всех представлений пространства имен, а _ViewStart.cshtml устанавливает общую мастер-страницу.

Мы можем продолжить работу с этим проектом, но в данном случае, чтобы упростить рассмотрение представлений и их функционала для работы возьмем простейший проект ASP.NET Core по типу ASP.NET Core Empty.

Подключение MVC в пустой проект ASP.NET Core

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

Определение контроллера и вызов представления. ViewResult

Для начала определим в проекте папку Controllers, в которую добавим новый контроллер - HomeController со следующим кодом:

using Microsoft.AspNetCore.Mvc;

namespace MvcApp.Controllers
{
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }
    }
}

За работу с представлениями отвечает объект ViewResult. Он производит рендеринг представления в веб-страницу и возвращает ее в виде ответа клиенту. Чтобы возвратить объект ViewResult, в методе контроллера вызывается метод View:

Вызов метода View возвращает объект ViewResult. Затем уже ViewResult производит рендеринг определенного представления в ответ. По умолчанию контроллер производит поиск представления в проекте по следующим путям:

/Views/Имя_контроллера/Имя_представления.cshtml
/Views/Shared/Имя_представления.cshtml

Согласно настройкам по умолчанию, если название представления не указано явным образом, то в качестве представления будет использоваться то, имя которого совпадает с именем действия контроллера. Например, вышеопределенное действие Index по умолчанию будет производить поиск представления Index.cshtml в папке /Views/Home/.

Однако пока у нас нет подобного представления, поэтому далее создадим его.

Создание представлений

Сначала создадим в проекте новую папку Views, а в ней определим новый каталог Home - для представлений контроллера HomeController.

Далее добавим в каталог Views/Home новый элемент по типу Razor View - Empty, который назовем index.cshtml:

Добавление нового представления Razor View в проект ASP.NET Core MVC на C#

То есть в итоге проект будет выглядеть следующим образом:

Добавление представлений Razor View в проект ASP.NET Core MVC на C#

Откроем представление Index.cshtml. По умолчанию оно имеет код наподобие следующего:

@*
    For more information on enabling MVC for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860
*@
@{
}

Изменим этот код следующим образом:

<!DOCTYPE html>
<html>
<head>
    <title>METANIT.COM</title>
    <meta charset="utf-8" />
</head>
<body>
    <h2>Привет METANIT.COM!</h2>
</body>
</html>

Данное представление напоминает обычную страницу html. Здесь могут быть определены все стандартные элементы разметки html, здесь могут подключаться стили, скрипты. Но полноценной html-страницей представление все равно не является, потому что во время выполнения эти представления компилируются в сборки и уже затем используются для генерации html-страниц, которые видит пользователь в своем браузере.

Подключение функционала представлений

Но просто определить в проекте файлы представлений недостаточно. Чтобы приложение могло использовать представления, нам надо подключить соответствующие сервисы. Для этого изменим код файла Program.cs следующим образом:

var builder = WebApplication.CreateBuilder(args);

// добавляем поддержку контроллеров с представлениями
builder.Services.AddControllersWithViews();
var app = builder.Build();

// устанавливаем сопоставление маршрутов с контроллерами
app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

Для подключения в приложение функционала контроллеров с представлениями применяется вызов AddControllersWithViews() (также можно применять методы AddMvcCore() и AddMvc())

И после запуска приложения и обращении к методу Index контроллера Home браузер отобразит нам веб-страницу, которая будет сгенерирована на основе представления Index.cshtml.

Рендеринг представлений Razor View в приложении ASP.NET Core MVC на C#

ViewResult и пути к представлениям

Чтобы возвратить объект ViewResult, который производит рендеринг представления в веб-страницу и возвращает ее в виде ответа клиенту, используется метод View(). Например, в пример выше применялась версия этого метода, которая не применяла параметров:

public class HomeController : Controller
{
    public IActionResult Index()
    {
        return View();
    }
}

Но вообще метод View() имеет четыре перегруженных версии:

  • View(): для генерации ответа используется представление, которое по имени совпадает с вызывающим методом

  • View(string? viewName): в метод передается имя представления, что позволяет переопределить используемое по умолчанию представление

  • View(object? model): передает в представление данные в виде объекта model

  • View(string? viewName, object? model): переопределяет имя представления и передает в него данные в виде объекта model

Вторая версия метода позволяет переопределить используемое представление. Если представление находится в той же папке, которая предназначена для данного контроллера, то в метод View() достаточно передать название представления без расширения:

public class HomeController : Controller
{
    public IActionResult Index()
    {
        return View("About");
    }
}

В этом случае метод Index будет использовать представление по пути Views/Home/About.cshtml. Если же представление находится в другой папке, то нам надо передать полный путь к представлению:

public class HomeController : Controller
{
    public IActionResult Index()
    {
        return View("~/Views/Some/About.cshtml");
    }
}

В данном случае предполагается, что представление располагается по пути Views/Some/About.cshtml

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850