Razor Pages объяснение и применение в ASP NET

Razor pages что это

Razor pages что это

Razor Pages представляет собой подход к разработке веб-приложений на ASP NET Core, который объединяет код страницы и логику обработки в одном файле или в связанной модели страницы. Это упрощает структуру проекта по сравнению с MVC, позволяя быстрее создавать CRUD-операции и управлять формами.

Каждая Razor Page состоит из двух файлов: .cshtml для разметки и .cshtml.cs для кода страницы. Такой подход разделяет визуальную часть и обработку данных, но сохраняет тесную связь между ними, что облегчает отладку и тестирование компонентов.

При работе с формами Razor Pages предоставляет встроенную привязку моделей через Model Binding, которая автоматически связывает данные из HTTP-запроса с объектами C#. Это позволяет минимизировать количество ручного кода для обработки ввода пользователя.

Маршрутизация в Razor Pages настраивается через структуру папок и атрибуты @page, что дает прямой контроль над URL без необходимости создавать отдельные контроллеры. Такой подход ускоряет настройку маршрутов для небольших и средних приложений.

Razor Pages поддерживает интеграцию с аутентификацией и авторизацией через ASP NET Identity. Можно ограничивать доступ к отдельным страницам или группам страниц, используя атрибут [Authorize], что обеспечивает защиту данных без дополнительных сложных настроек.

Создание проекта с Razor Pages в Visual Studio

Для создания нового проекта Razor Pages в Visual Studio выберите «Создать проект» и в списке шаблонов укажите ASP.NET Core Web App. Убедитесь, что выбран фреймворк .NET 7.0 или выше, так как последние версии обеспечивают улучшенную производительность и поддержку новых функций Razor Pages.

На следующем шаге установите следующие параметры:

Параметр Рекомендованное значение
Тип аутентификации Individual Accounts (для приложений с пользовательской регистрацией) или None (для простых прототипов)
Включить HTTPS Да
Включить Docker Нет, если не требуется контейнеризация
Enable Razor Runtime Compilation Да, для быстрого обновления страниц без перезапуска приложения

После создания проекта Visual Studio автоматически формирует структуру с папками Pages, wwwroot и файлами _Layout.cshtml и _ViewStart.cshtml. Папка Pages содержит стартовую страницу Index.cshtml и страницу ошибок Error.cshtml, что позволяет сразу запустить приложение для проверки базовой функциональности.

Для запуска проекта используйте кнопку IIS Express или Run в Visual Studio. Адрес локального сервера отображается в окне браузера, где можно проверить работу Razor Pages и корректность маршрутизации.

Структура папок и файлов Razor Pages

Структура папок и файлов Razor Pages

Основная папка проекта Razor Pages – Pages. В ней находятся файлы страниц с расширением .cshtml и связанные с ними модели страниц .cshtml.cs. Каждая пара файлов отвечает за отображение и обработку данных конкретной страницы.

Работа с моделями данных в Razor Pages

Работа с моделями данных в Razor Pages

В Razor Pages модели данных определяются в классе страницы .cshtml.cs через свойства с атрибутами [BindProperty] для привязки данных из форм. Это позволяет автоматически передавать значения из HTTP-запроса в объект модели без ручного парсинга.

Для взаимодействия с базой данных используется DbContext из Entity Framework Core. Рекомендуется внедрять его через конструктор класса страницы, чтобы обеспечить контроль зависимостей и поддерживать тестируемость кода.

Методы страницы OnGet() и OnPost() отвечают за обработку запросов GET и POST. В OnGet() загружаются данные для отображения, а в OnPost() выполняется проверка модели через ModelState.IsValid и сохранение изменений в базу.

Для сложных операций можно создавать отдельные классы моделей в папке Models и использовать их в Razor Pages. Это позволяет разделять бизнес-логику и представление, упрощает повторное использование кода и масштабирование проекта.

Обработка форм и привязка данных

Обработка форм и привязка данных

Razor Pages обеспечивает прямую привязку данных форм к свойствам страницы через атрибут [BindProperty]. Это позволяет получать значения полей без дополнительного кода парсинга и упрощает валидацию.

Для работы с формами применяются методы страницы:

  • OnGet() – загружает начальные данные для отображения формы.
  • OnPost() – обрабатывает отправку данных формы и выполняет проверку ModelState.IsValid.

Рекомендуется использовать аннотации данных для валидации на стороне сервера:

  • [Required] – обязательное поле.
  • [StringLength] – ограничение длины строки.
  • [Range] – диапазон числовых значений.
  • [EmailAddress] – проверка формата электронной почты.

Для улучшения UX можно использовать теги Razor в .cshtml:

  1. asp-for – связывает элемент формы с свойством модели.
  2. asp-validation-for – отображает ошибки валидации рядом с полем.
  3. Tag Helpers – автоматически генерируют корректные атрибуты HTML для форм.

Для сложных форм с множественными объектами можно применять коллекции List<T> или создавать частичные страницы (Partial Pages) для отдельных блоков формы, что упрощает поддержку и расширение функционала.

Маршрутизация и настройка URL для страниц

В Razor Pages маршрут каждой страницы определяется расположением .cshtml файла в папке Pages и атрибутом @page в начале файла. Например, файл Pages/Products/Details.cshtml по умолчанию доступен по URL /Products/Details.

Для создания пользовательских URL можно использовать параметр в директиве @page:

@page «/Products/{id:int}» – маршрут ожидает числовой параметр id, который автоматически передается в метод OnGet(int id).

Razor Pages поддерживает опциональные параметры и несколько сегментов URL:

  • @page «/Blog/{year:int}/{month:int?}» – параметр month необязателен.
  • Маршруты можно комбинировать с ограничениями типов, чтобы предотвратить ошибки при неправильных URL.

Для настройки маршрутизации на уровне приложения используется Startup.cs или Program.cs:

  • app.MapRazorPages(); – подключает маршрутизацию Razor Pages.
  • Можно добавлять фильтры или middleware для перехвата запросов и перенаправления на нужные страницы.

Использование логической структуры папок и явного указания маршрутов повышает читаемость URL и упрощает поддержку приложения при расширении функционала.

Использование частичных страниц и компонентов

Частичные страницы (Partial Pages) в Razor Pages позволяют выделять повторяющиеся блоки интерфейса в отдельные файлы .cshtml. Это упрощает поддержку и повторное использование кода.

Для вставки частичной страницы используется тег Razor Partial или PartialAsync:

  • @await Html.PartialAsync(«_Menu») – подключение меню на нескольких страницах.
  • @Html.Partial(«_Footer») – вставка футера без асинхронной обработки.

Компоненты (View Components) обеспечивают более сложную логику, чем частичные страницы. Они содержат отдельный класс с методом InvokeAsync() и соответствующий .cshtml файл разметки.

Преимущества использования компонентов:

  1. Изоляция бизнес-логики и отображения.
  2. Повторное использование в нескольких страницах без дублирования кода.

Пример вызова компонента в Razor Page:

@await Component.InvokeAsync(«RecentPosts», new { count = 5 }) – отображает последние 5 записей блога, передавая параметры в компонент.

Рекомендуется использовать частичные страницы для статических блоков интерфейса и компоненты для блоков с динамическими данными или сложной логикой.

Аутентификация и авторизация в Razor Pages

В Razor Pages управление пользователями реализуется через ASP NET Identity. При создании проекта с аутентификацией выбирается шаблон Individual Accounts, который автоматически добавляет таблицы пользователей, ролей и токенов в базу данных.

Для ограничения доступа к страницам применяется атрибут [Authorize]. Он может использоваться для отдельных страниц или групп страниц через PageModel:

  • [Authorize] – разрешает доступ только аутентифицированным пользователям.
  • [Authorize(Roles=»Admin»)] – ограничивает доступ пользователям с определенной ролью.
  • [AllowAnonymous] – разрешает доступ всем, независимо от авторизации.

В Program.cs настраиваются схемы аутентификации и политики авторизации:

  • builder.Services.AddAuthentication() – подключает механизм проверки учетных данных.
  • builder.Services.AddAuthorization() – определяет правила доступа для ролей и политик.

На уровне страниц доступ к данным можно контролировать через свойства User.Identity.IsAuthenticated и User.IsInRole(«RoleName»). Это позволяет показывать контент только определенным пользователям.

Для безопасной работы с формами рекомендуется включать CSRF-защиту, использовать отдельные страницы для входа и выхода, а также управлять токенами восстановления пароля и подтверждения почты через Identity.

Вопрос-ответ:

В чем отличие Razor Pages от традиционного MVC в ASP NET?

Razor Pages упрощает организацию кода за счет объединения разметки и логики страницы в отдельных файлах .cshtml и .cshtml.cs. В отличие от MVC, где каждый контроллер обслуживает несколько видов, Razor Pages связывает конкретную страницу с моделью, что уменьшает количество маршрутов и упрощает обработку форм и привязку данных. Такой подход позволяет быстрее создавать страницы с CRUD-операциями и локализованной логикой.

Как правильно использовать [BindProperty] при работе с формами?

Атрибут [BindProperty] связывает данные из HTTP-запроса с объектом модели страницы. Его следует применять к свойствам, которые будут заполняться формами. Для безопасной работы рекомендуется использовать ModelState.IsValid в методах OnPost(), чтобы проверять корректность введенных данных перед сохранением в базу. Если форма содержит вложенные объекты или коллекции, можно использовать привязку к спискам или отдельным классам моделей.

Каким образом настроить кастомные URL для Razor Pages?

Кастомные маршруты задаются с помощью директивы @page в начале .cshtml файла. Например, @page «/Products/{id:int}» создаст маршрут, принимающий числовой параметр id. Для опциональных параметров используют знак вопроса ?, например @page «/Blog/{year:int}/{month:int?}». Кроме того, структура папок влияет на URL, что позволяет логически группировать страницы и упрощает их адресацию без создания дополнительных контроллеров.

Как организовать авторизацию на уровне страниц Razor Pages?

Для ограничения доступа используют атрибут [Authorize] на PageModel или отдельной странице. Можно указывать роли: [Authorize(Roles=»Admin»)] — доступ только пользователям с ролью Admin. Атрибут [AllowAnonymous] разрешает открытый доступ. В Program.cs подключаются схемы аутентификации и политики авторизации через builder.Services.AddAuthentication() и builder.Services.AddAuthorization(). На странице проверка текущего пользователя осуществляется через User.Identity.IsAuthenticated и User.IsInRole(«RoleName»), что позволяет условно показывать контент.

Ссылка на основную публикацию