Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7
Когда мы обращаемся к приложению, то посылаем ему запрос определенного типа - get, post, put и т.д. Для обработки запросов в Razor Pages можно определять соответствующие методы, которые называются по шаблону On[Тип_запросы], либо можно использовать их асинхронные двойники On[Тип_запросы]. Например, запрос Get обрабатывается методами OnGet() и OnGetAsync(), а запросы Post - методами OnPost() и OnPostAsync().
Возьмем проект RazorPages и добавим в него новую страницу Exchange.cshtml:
Допустим, наша страница будет предоставлять информацию об обменном курсе. Пусть файл Exchange.cshtml.cs будет обрабатывать get и post запросы следующим образом:
using Microsoft.AspNetCore.Mvc.RazorPages; namespace RazorPagesApp.Pages { public class ExchangeModel : PageModel { public string Message { get; set; } private readonly decimal currentRate = 64.1m; public void OnGet() { Message = "Введите сумму"; } public void OnPost(int? sum) { if (sum == null || sum < 1000) { Message = "Передана некорректная сумма. Повторите ввод"; } else { decimal result = sum.Value /currentRate; // ToString("F2") - форматирование числа: F2 - дробное число с 2 знаками после запятой Message = $"При обмене {sum} рублей вы получите {result.ToString("F2")}$."; } } } }
И также изменим страницу Exchange.cshtml:
@page @model ExchangeModel @{ ViewData["Title"] = "Обмен валюты"; } <h2>@Model.Message</h2> <form method="post"> <input type="number" name="sum" /> <input type="submit" value="Send" /> </form>
При получении запроса get приложение просто будет отдавать данную страницу с формой ввода. При получении запроса post класс ExchangeModel получит отправленное значение и подсчитает результат, который потом выводится на страницу. При этом, чтобы система могла связать параметры запроса со значениями формы также, как и в MVC поля форм (их атрибут name) должны называться также, как и параметры методов OnPost или OnGet.
При запуске страница отобразит приглашение к вводу:
А при отправке введенного значения отобразится результат:
Для обработки запроса можно использовать класс, производный от PageModel. Однако страница Razor уже сама по себе представляет модель. И мы можем всю логику обработки и свойства модели определить напрямую в странице. Например, изменим страницу Exchange.cshtml:
@page @{ ViewData["Title"] = "Обмен валюты"; } @functions { public string Message { get; set; } private readonly decimal currentRate = 64.1m; public void OnGet() { Message = "Введите сумму"; } public void OnPost(int? sum) { if (sum == null || sum < 1000) { Message = "Передана некорректная сумма. Повторите ввод"; } else { decimal result = sum.Value /currentRate; Message = $"При обмене {sum} рублей вы получите {result.ToString("F2")}$."; } } } <h3>@Model.Message</h3> <form method="post"> <input type="number" name="sum" /> <input type="submit" value="Send" /> </form>
Теперь класс ExchangeModel никак не используется, вся логика определена непосредственно на странице, поэтому работать она будет также как и ранее.
Однако не все такой подход может показаться привлекательным из-за того, что визуальное представление смешивается с логикой и представлением данных. Поэтому, как правило, подход с классом, производным от PageModel, является более предпочтительным.