Возвращение результата в Razor Pages

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

Все рассмотренные в прошлых статьях методы OnGet и OnPost, предназначенные для обработки GET и POST-запросов, ничего не возвращали, то есть имели в качестве возвращаемого типа тип void и просто выполняли некоторое действие:

public void OnGet()
{
	// обработка запроса
}
public void OnPost()
{
	// обработка запроса
}

В реальности данные методы по умолчанию возвращали связанную с классом страницу Razor. Однако иногда возникает необходимость возвратить некоторый результат, например, статусный код ошибки или сделать редирект. Для подобных ситуаций данные методы также могут возвращать объекты IActionResult. И для этого в классе PageModel определено ряд методов:

  • Content() возвращает объект ContentResult, то есть фактически некоторое текстовое содержимое

  • File() возвращает с помощью различных перегруженных версий объекты FileContentResult/FileStreamResult/VirtualFileResult, то есть отправляет клиенту файл

  • Forbid() возвращает статусный код 403

  • LocalRedirect()/LocalRedirectPermanent() выполняет переадресацию по определенному локальному адресу

  • NotFound() возвращает статусный код 404

  • PhysicalFile() возвращает файл по физическому пути

  • Page() возвращает объект PageResult или фактически текущую страницу Razor

  • Redirect()/RedirectPermanent() выполняет переадресацию по определенному адресу

  • RedirectToAction()/RedirectToActionPermanent() выполняет переадресацию на определенное действие контроллера

  • RedirectToPage()/RedirectToPagePermanent() выполняет переадресацию на определенную страницу Razor

  • RedirectToRoute()/RedirectToRoutePermanent() выполняет переадресацию по определенному маршруту

  • StatusCode() возвращает объект StatusCodeResult, то есть посылает статусный код

  • Unauthorized() возвращает объект UnauthorizedResult, то есть статусный код ошибки 401

  • Для отправки json нет определенного метода, но определен специальный тип JsonResult, в конструктор которого можно передавать отправляемый код json.

Пусть у нас есть страница Razor Index.cshtml и код связанной модели IndexModel в файле Index.cshtml.cs:

OnGet и OnPost в Razor Page в ASP.NET Core и C#

Например, на странице Index.cshtml определим следующий код:

@page

@model RazorPagesApp.Pages.IndexModel

<h2>Hello Razor Pages!</h2>

Здесь выводится заголовок "Hello Razor Pages!".

А в файле Index.cshtml.cs определим следующий код:

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

namespace RazorPagesApp.Pages
{
    public class IndexModel : PageModel
    {
        public IActionResult OnGet()
        {
            return Content("Hello METANIT.COM!");
        }
    }
}

Теперь метод OnGet() возвращает объект IActionResult. В частности, он вызывает другой метод - Content(). В этот метод передается отправляемое клиенту текстовое содержимое. Результатом метода Content() является объект ContentResult - реализация интерфейса IActionResult.

В итоге при запуске приложения мы увидим в браузере не то содержимое, которое определено на странице Index.cshtml, а тот текст, который отправляется из метода Content()

Отправка ответа на страницах Razor Pages в методе OnGet в ASP.NET Cre и C#

То есть в данном случае страница Razor никак не задействуется. Где это может пригодиться? Это может пригодиться в ситуациях, когда нам надо возвратить клиенту результат, отличный от страницы razor, например, статусный код, какой-то контент в формате json, отправить файл, сделать переадресацию или что-то другое.

В то же время мы можем также явным образом возвратить код страницы Razor с помощью метода Page():

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

namespace RazorPagesApp.Pages
{
    public class IndexModel : PageModel
    {
        public IActionResult OnGet()
        {
            return Page();
        }
    }
}
Явная отправка страницы в методе OnGet в Razor Pages ASP.NET Core и C#

Использование типа IActionResult в качестве возвращаемого значения может пригодиться также, когда необходимо возвратить разные результаты в зависимости от условий. Например:

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

namespace RazorPagesApp.Pages
{
    public class IndexModel : PageModel
    {
        public IActionResult OnGet(string? name)
        {
            if(name != null) return Content($"Hello {name}");
            return Page();
        }
    }
}

В данном случае если при обращении к странице через строку запроса передан параметр name, то возвращается результат метода Content(). Если параметр name не установлен, то возвращается связанная страница Razor.

отправка ответа по условию из страницы Razor Pages в методе OnGet в ASP.NET Core и C#
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850