Самый популярный и эффективный метод отобразить пользователю страницу – использовать представления. До сих пор мы отображали что-то простое с помощью контроллеров, отображать так целую страницу может быть далеко не самым эффективным решением.
Контроллеры, с которыми мы познакомились должны принимать только базовые решения, вся логика должна жить отдельно. Контроллеры не должны отвечать и за отображение данных, это дело представлений и об этом я говорил в вводной части этой главы: .NET Core и MV
Для создания представлений сейчас самым популярным движком является Razor. Это встроенный движок, но можно создавать и свой собственный, хотя я никогда не видел в этом надобности.
Когда контроллер хочет отобразить специальный файл представления он должен вернуть в качестве результата работы метода тип ViewResult, который можно создать, просто вернув результат работы метода View:
public IActionResult Index() { return View(); }
Я создам в моем тестовом проекте новый контроллер, на котором и буду показывать работу всего, что мы сейчас будем изучат. Кликаем правой кнопкой по папке Controllers:
В появившемся окне слева выбираем ASP.NET Core, справа выбираем MVC Controller Class и внизу выбираем имя файла, для этого примера это будет RazortestController.
Visual Studio создаст для нас файл со следующим содержимым:
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; namespace MyWebSite.Controllers { public class RazortestController : Controller { public IActionResult Index() { return View(); } } }
Так как контроллер называется razortest а метод index, то согласно маршрутизации по умолчанию доступ к такому методу можно получить из браузера, если обратиться по следующему адресу: /razortest/index, то произойдет ошибка, потому что нет самого представление, которое должно быть отдельным файлом, где мы можем писать HTML и инструкции C# с помощью синтаксиса Razor. Ошибка будет выглядеть так:
Тут нам говорят, что View с именем Index не найдено. Его пытались найти в следующих местах:
Причем поиск происходит в указанном порядке. Первое, куда смотрит система – в папку View. Потом смотрит в папку с таким же именем, как у контроллера (кроме самого слова Controller). У нас контроллер называется RazortestController, так что отбросив слово Controller путь превращается в /views/razortest. И вот здесь должен быть файл с именем, которое совпадает с именем метода и расширением cshtml. У нас метод Index, а значит файл должен быть Index.cshtml.
Расширение файла не случайно cshtml, это сочетание cs и html и отражает реальную суть файла – здесь можно смешивать html код и cs.
Итак, теперь, когда мы обращаемся к контроллеру, он вызывает метод View, который находит файл представления, исполняет в нем код и возвращает результат пользователю в виде HTML.
Имя cshtml файла можно изменить. Если вы хотите в методе Index отобразить файл Test.cshtml, это можно сделать, если указать имя нужного нам представления в качестве параметра метода View:
public IActionResult Index() { return View("Test"); }
Этот метод тоже завершит выполнение ошибкой, потому что представления с именем Test у нас тоже нет.
В тех случаях, когда представление будет использоваться только для определенного контроллера, его желательно помещать в папку с именем контроллера, в нашем случае это /views/razortest. Если представление будет использоваться сразу с несколькими разными контроллерами или действиями, то его желательно помещать в папку Shared.
Для первого примера мы создадим представление, которое будет обслуживать только один метод и поэтому вернемся к имени по умолчанию.
public IActionResult Index() { return View(); }
У меня в проекте уже есть папка View, а в ней есть Home. Не помню, когда я их создавал, возможно они автоматом были созданы. Мне же нужна папка rasortest и для ее можно создать в файловой системе, используя файловый менеджер или с помощью VS (Visual Studio). Щелкаем правой кнопкой мыши по папку Views и выбираем из контекстного меню Add -> New Folder и вводим имя папки rasortest.
Теперь нужно создать View – кликаем правой кнопкой мыши по папке rasortest и выбираем Add -> New File и перед нами открывается уже знакомое окно выбора типа и имени файла. Выбирайте MVC View Page, как показано на рисунке ниже и в качестве имени файла оставляет Index:
Теперь все представления, которые мы будем использовать в контроллере RazorController будут храниться в папке Views/Razor.
@* For more information on enabling MVC for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860 *@ @{ }
Игнорируем пока то, что для нас тут сгенерировал VS, а вместо этого напишем немного HTML кода:
<body> <h1>Hello</h1> <p>This is a view</p> </body> </html>
Запускаем сайт, переходит по адресу /razortest/index и видим результат страницы: