Razor Pages

Введение в Razor Pages

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7

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

Начиная с версии 2.0 в ASP.NET Core была добавлена такая функциональность, как Razor Pages. Razor Pages предоставляют технологию, альтернативную системе Model-View-Controller. Razor Pages позволяют создавать страницы с кодом Razor, которые могут обрабатывать запросы. В некоторой степени эта функциональности напоминает работу веб-форм, которые представляли страницу с расширением aspx и имели файл логики на C#, связанный с данной страницей. В этом плане Razor Pages представляют альтернативу стандартной модели MVC для построения приложения.

Больше всего Razor Pages подходят для создания небольших приложений.

Для начала работы с Razor Pages создадим новый проект ASP.NET Core. При создании проекта укажем шаблон Web Application:

Razor Pages в ASP.NET Core

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

Проект Razor Pages в ASP.NET Core

Главным же отличием данного проекта от других типов проектов будет наличие папки Pages. Эта папка содержит все страницы Razor, которые есть в проекте по умолчанию. Каждая страница Razor представляет файл с расширением .cshtml и содержит смесь кода html и конструкций C#. По сути это те же самые представления, что используются в MVC. Но в отличие от MVC с каждой страницей Razor связан файл отделенного кода логики на C#. Например, с файлом Index.cshtml, который определяет визуальную часть с помощью синтаксиса Razor + HTML/CSS, связан файл Index.cshtml.cs, который определяет логику страницы или ее поведение с помощью кода C#. В какой-то степени эта модель похожа на то, что имеется в WPF или Xamarin Forms, где есть файл, который определяет визуальную часть, и есть связанный с ним файл кода, который определяет поведение.

По умолчанию в папке Pages имеются следующие файлы:

  • _Layout.cshtml: мастер-страница, в которую вставляются страницы Razor

  • _ViewStart.cshtml: задает мастер-страницу

  • _ViewImports.cshtml: определяет директивы Razor, которые добавляются на каждую страницу Razor

  • _ValidationScriptsPartial.cshtml: частичное представление, которое подключает js-скрипты валидации на стороне клиента

  • Index.cshtml, Error.cshtml и Privacy.cshtml: собственно страницы Razor, которые определяют визуальную часть страницы и логику обработки запроса.

Подключение Razor Pages

Для подключения сервисов Razor Pages применяется метод AddRazorPages. Например, во вновь созданном проекте мы можем увидеть в классе Startup в методе ConfigureServices подключение Razor Pages:

public void ConfigureServices(IServiceCollection services)
{
	services.AddRazorPages();
}

В действительности Razor Pages работают поверх фреймворка MVC, поэтому мы можем подключить и с помощью метода AddMvc():

public void ConfigureServices(IServiceCollection services)
{
	services.AddMvc();
}

Однако AddMvc() подключает в целом всю возможную функциональность фреймворка MVC, в том числе возможность использования контроллеров с представлениями. Если мы не собираемся использовать контроллеры, то логично подключать Razor Pages с помощью метода AddRazorPages().

Маршрутизация в RazorPages

Другим важным моментом является маршрутизация или как Razor Pages сопоставляются с запросами. По умолчанию проект с Razor Pages для обработки запросов используется конечные точки, то связку компонентов middleware EndpointMiddleware и EndpointRoutingMiddleware:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
	if (env.IsDevelopment())
	{
		app.UseDeveloperExceptionPage();
	}
	else
	{
		app.UseExceptionHandler("/Error");
		app.UseHsts();
	}

	app.UseHttpsRedirection();
	app.UseStaticFiles();

	app.UseRouting();

	app.UseAuthorization();

	app.UseEndpoints(endpoints =>
	{
		endpoints.MapRazorPages();	// Добавляем маршрутизацию для Razor Pages
	});
}

Непосредствено для связи с Razor Pages применяется метод endpoints.MapRazorPages(). В остальных аспектах класс Startup не отличается от того, что мы имеем в проекте MVC.

В итоге строка запроса URL будет сопоставляться с определенной страницей Razor на основании ее расположения в проекте в папке Pages. Примеры строк URL и сопоставленных с ними страниц:

Путь к странице

URL

/Pages/Index.cshtml

/ или /Index

/Pages/Contact.cshtml

/Contact

/Pages/Store/Contact.cshtml

/Store/Contact

/Pages/Store/Index.cshtml

/Store или /Store/Index

Обработка запросов

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

@page
@model IndexModel
@{
    ViewData["Title"] = "Home page";
}

<div class="text-center">
    <h1 class="display-4">Welcome</h1>
    <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>

В начале идет директива @page, которая по сути и делает обычное представление страницей Razor. Эта директива позволяет страницам обрабатывать запросы напрямую без контроллеров.

Следующая директива - @model определяет модель представления - в данном случае класс IndexModel.

С этой страницей связан файл кода Index.cshtml.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;

namespace RazorPagesApp.Pages
{
    public class IndexModel : PageModel
    {
        private readonly ILogger<IndexModel> _logger;

        public IndexModel(ILogger<IndexModel> logger)
        {
            _logger = logger;
        }

        public void OnGet()
        {

        }
    }
}

Модель страницы наследуется от класса PageModel. Данная модель определяет переменную _logger, в которую в конструкторе через механизм Dependency Injection передается класс логгера для осуществления логгирования.

Кроме того, в классе модели определен метод OnGet. Этот метод обрабатывает GET-запросы. В данном случае он пуст.

Запустим проект на выполнение. Фактически страницы Razor могут обрабатывать запросы так же, как и контроллеры. Например, обратимся к Index.cshtml и для этого введем адрес /Index:

Обращение к Razor Page в ASP.NET Core

Поскольку страница Index.cshtml по умолчанию сопоставляется с корнем приложения, то для обращения к ней можно не указывать Index.

Подобным образом для обращения к странице Privacy надо перейти по адресу /Privacy.

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