Обычно при обращении к веб-приложению пользователь ожидает получить веб-страницу с какими-нибудь данными. В MVC для этого, как правило, используются представления, которые определяют внешний вид приложения и на основе которых потом формируется веб-страница. В ASP.NET MVC Core представления - это файлы с расширением cshtml, которые содержат код пользовательского интерфейса в основном на языке html, а также конструкции Razor - специального движка представлений, который позволяет переходить от кода html к коду на языке C#.
Для хранения представлений в проекте ASP.NET Core предназначена папка Views. Например, если мы возьмем проект по типу ASP.NET Core Web App (Model-View-Controller), то мы увидим, что он содержит ряд представлений:
Подобный проект для хранения представлений в папке 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.
Пусть этот проект называется MvcApp. По умолчанию проект по данному шаблону не содержит никаких контроллеров и представлений. Поэтому сначала определим контроллер, который будет использовать представления.
Для начала определим в проекте папку 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:
То есть в итоге проект будет выглядеть следующим образом:
Откроем представление 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.
Чтобы возвратить объект 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