Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7
Для рассмотрения механизма передачи параметров возьмем проект ASP.NET Core по типу Web Application, который использует Razor Pages и добавим в его папку Pages новую страницу Razor, которую назовем Person.cshtml:
После этого в проект в папку 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 получит переданные значения через параметры и переустановит свойство Message:
Хотя такой способ работает, но мы можем также использовать и другой способ, который представляет применение атрибута 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; } }
Теперь изменим файл 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. А приложение будет работать также, как и раньше.