Параметры маршрутов в Razor Pages

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

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

Кроме получения данных из параметры запроса и из отправленных форм мы также можем получать данные из параметров маршрута. И в данном случае важно понимать отличие параметров строки запроса от параметров маршрута. Например:

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, мы можем получить параметры маршрута.

Параметры маршрута в Razor Pages в ASP.NET Core

Также мы можем получить параметры маршрута через одноименные параметры метода 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()
        {
        }
    }
}
Получение параметров маршрутов в ASP.NET Core UserPages

Ограничения параметров

Как и в стандартной модели 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 можно посмотреть в статье Ограничения маршрутов.

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