Обработка запросов. Передача форм

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

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

Когда мы обращаемся к приложению, то посылаем ему запрос определенного типа - get, post, put и т.д. Для обработки запросов в Razor Pages можно определять соответствующие методы, которые называются по шаблону On[Тип_запросы], либо можно использовать их асинхронные двойники On[Тип_запросы]. Например, запрос Get обрабатывается методами OnGet() и OnGetAsync(), а запросы Post - методами OnPost() и OnPostAsync().

Возьмем проект RazorPages и добавим в него новую страницу Exchange.cshtml:

OnGet и OnPost в Razor Page в ASP.NET Core

Допустим, наша страница будет предоставлять информацию об обменном курсе. Пусть файл 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.

При запуске страница отобразит приглашение к вводу:

OnGet в Razor Pages

А при отправке введенного значения отобразится результат:

OnPost в Razor Pages

Для обработки запроса можно использовать класс, производный от 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, является более предпочтительным.

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