Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7
Кроме получения данных из параметры запроса и из отправленных форм мы также можем получать данные из параметров маршрута. И в данном случае важно понимать отличие параметров строки запроса от параметров маршрута. Например:
localhost:5000/Index?id=23 localhost:5000/Index/23
Параметры, которые идут после вопросительного знака в url представляют параметры строки запроса. А данные, которые разделены в url слешами, представляют параметры маршрута. Один url может содержать как параметры маршрута, так и параметры запроса.
Чтобы определить параметры маршрута, необходимо после на странице после директивы @page определить шаблон маршрута. Например, мы хотим получать из маршрута параметр id:
@page "{id}"
К примеру, у нас есть страница Person.cshtml. Используем на ней параметр id:
@page "{id}" @{ var userid = RouteData.Values["id"]; } <h2>Id = @userid</h2>
С помощью свойства RouteData.Values
, как и в контроллерах MVC, мы можем получить параметры маршрута.
Также мы можем получить параметры маршрута через одноименные параметры метода OnGet:
@page "{id}" @functions{ public int Id { get; set; } public void OnGet(int id) { Id = id; } } <h2>Id = @Id</h2>
Либо если мы используем PageModel, то мы могли бы также получить параметр маршрута через OnGet:
using Microsoft.AspNetCore.Mvc.RazorPages; namespace RazorPagesApp.Pages { public class PersonModel : PageModel { public int Id { get; set; } public void OnGet(int id) { Id = id; } } }
Тогда в коде страницы Person.cshtml достаточно получить свойство Id у модели:
@page "{id}" @model PersonModel <h2>Id = @Model.Id</h2>
И также, как и в случае с параметрами строки запроса, мы можем получить значение параметра маршрута, используя атрибут BindProperty:
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; namespace RazorPagesApp.Pages { public class PersonModel : PageModel { [BindProperty(SupportsGet = true)] public int Id { get; set; } public void OnGet() { } } }
При необходимости мы можем передавать несколько параметров маршрута. Каждый параметр заключается в фигурные скобки и отделяется от других параметров слешами:
@page "{id}/{name}/{age}" @model PersonModel <p>Id = @Model.Id</p> <p>Name = @Model.Name</p> <p>Age = @Model.Age</p>
В данном случае получаем три параметра id, name и age. Изменим код PersonModel, чтобы получить эти параметры:
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; namespace RazorPagesApp.Pages { public class PersonModel : PageModel { [BindProperty(SupportsGet = true)] public int Id { get; set; } [BindProperty(SupportsGet = true)] public string Name { get; set; } [BindProperty(SupportsGet = true)] public int Age { get; set; } public void OnGet() { } } }
Как и в стандартной модели MVC для параметров маршрутов в Razor Pages можно применять ограничения:
@page "{id:int}/{name:alpha:minlength(3)}/{age:int}" @model PersonModel <p>Id = @Model.Id</p> <p>Name = @Model.Name</p> <p>Age = @Model.Age</p>
В данном случае параметры id и age должны обязательно представлять число, а параметр name может содержать только алфавитные символы, причем не менее трех символов. Подробнее про ограничения маршрутов в MVC можно посмотреть в статье Ограничения маршрутов.