Привязка свойств RazorPage к параметрам запроса

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

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

Для рассмотрения механизма передачи параметров возьмем проект ASP.NET Core по типу Web Application, который использует Razor Pages и добавим в его папку Pages новую страницу Razor, которую назовем Person.cshtml:

Передача параметров в Razor Page

После этого в проект в папку Pages будет добавлена страница Person.cshtml и связанный с ней файл кода Person.cshtml.cs. Допустим, данная страница предназначена для ввода данных пользователя, и нам их надо получить при отправке.

Самый простой способ получения данных - использование параметров в метода OnGet/OnPost/OnPut/OnDelete. Поэтому изменим файл Person.cshtml.cs следующим образом:

using Microsoft.AspNetCore.Mvc.RazorPages;

namespace RazorPagesApp.Pages
{
    public class PersonModel : PageModel
    {
        public string Message { get; set; }
        public void OnGet()
        {
            Message = "Введите данные";
        }
        public void OnPost(string name, int age)
        {
            Message = $"Имя: {name}  Возраст: {age}";
        }
    }
}

На самой странице Person.cshtml определим форму отправки данных:

@page
@model PersonModel
@{
    ViewData["Title"] = "Ввод данных";
}
<h2>@Model.Message</h2>
<form method="post">
    <label for="name">Имя</label><br />
    <input type="text" name="name" id="name" /><br /><br />
    <label for="age">Возраст</label><br />
    <input type="number" name="age" id="age" /><br /><br />
    <input type="submit" value="Оправить" />
</form>

При этом элементы формы называются также, как и параметры - name и age.

Обратимся к этой странице:

Передача параметров в OnPost Razor Page

Метод OnPost получит переданные значения через параметры и переустановит свойство Message:

Параметры в Razor Page

Хотя такой способ работает, но мы можем также использовать и другой способ, который представляет применение атрибута BindProperty. Для его использования изменим код Person.cshtml.cs:

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace RazorPagesApp.Pages
{
    public class PersonModel : PageModel
    {
        public string Message { get; set; }
		
        [BindProperty]
        public string Name { get; set; }
        [BindProperty]
        public int Age { get; set; }
		
        public void OnGet()
        {
            Message = "Введите данные";
        }
        public void OnPost()
        {
            Message = $"Имя: {Name}  Возраст: {Age}";
        }
    }
}

Теперь можно убрать параметры из метода OnPost. Все значения будут передаваться по имени свойствам Name и Age. Поэтому результат работы приложения не изменится.

Атрибут BindProperty имеет ряд свойств, через которые мы можем управлять им:

  • Type: тип привязчика модели

  • Name: имя данных в запросе, если оно отличается

  • SupportGet: поддерживает ли запросы get

Например:

[BindProperty(Name="id", SupportsGet=true)]
public string Name { get; set; }

Причем по умолчанию свойство SupportGet имеет значение false. Поэтому если мы хотим передавать параметры через строку запроса типа:

http://localhost:5000/Person?name=Tom&age=23

То у свойств для этого атрибута надо установить параметр SupportsGet=true:

public class PersonModel : PageModel
{
	public string Message { get; set; }
		
	[BindProperty(SupportsGet=true)]
	public string Name { get; set; }
	[BindProperty(SupportsGet=true)]
	public int Age { get; set; }
		
	public void OnGet()
	{
		Message = $"Имя: {Name}  Возраст: {Age}";
	}
	public void OnPost()
	{
		Message = $"Имя: {Name}  Возраст: {Age}";
	}
}

Однако поскольку оба свойства представляют фактически одну сущность, то естественно лучше работать с ними, как со свойствами одного объекта. Поэтому создадим в проекте новую папку Models, а в нее добавим новый класс, который назовем Person.

public class Person
{
	public string Name { get; set; }
	public int Age { get; set; }
}
BindProperty в Razor Pages

Теперь изменим файл Person.cshtml.cs:

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using RazorPagesApp.Models;

namespace RazorPagesApp.Pages
{
    public class PersonModel : PageModel
    {
        public string Message { get; set; }

        [BindProperty]
        public Person Person { get; set; }
        public void OnGet()
        {
            Message = "Введите данные";
        }
        public void OnPost()
        {
            Message = $"Имя: {Person.Name}  Возраст: {Person.Age}";
        }
    }
}

Теперь все данные будут передаваться свойствам объекта Person. А приложение будет работать также, как и раньше.

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