
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 – Pages. В ней находятся файлы страниц с расширением .cshtml и связанные с ними модели страниц .cshtml.cs. Каждая пара файлов отвечает за отображение и обработку данных конкретной страницы.
Работа с моделями данных в 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:
- asp-for – связывает элемент формы с свойством модели.
- asp-validation-for – отображает ошибки валидации рядом с полем.
- 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 файл разметки.
Преимущества использования компонентов:
- Изоляция бизнес-логики и отображения.
- Повторное использование в нескольких страницах без дублирования кода.
Пример вызова компонента в 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»), что позволяет условно показывать контент.
