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

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

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

Все ранее рассмотренные методы 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

Большинство этих методов и возвращаемых ими результатов было рассмотрено ранее в теме Результаты действий контроллеров и ряде последующих статей. В данном случае рассмотрим некоторые моменты, которые могут вызвать трудности. Например, в зависимости от результата надо возвратить либо статусный код ошибки, либо страницу Razor.

Например, пусть у нас есть класс Person, который представляет данные:

public class Person
{
	public string Name { get; set; }
	public int Age { get; set; }
}

Допустим, мы хотим в PageModel получить из списка по имени нужный объект Person:

using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNetCore.Mvc.RazorPages;
using RazorPagesApp.Models;
using Microsoft.AspNetCore.Mvc;

namespace RazorPagesApp.Pages
{
    public class PersonModel : PageModel
    {
        List<Person> people;
        public Person Person { get; set; }
        public PersonModel()
        {
            people = new List<Person>()
            {
                new Person{ Name="Tom", Age=23},
                new Person {Name = "Sam", Age=25},
                new Person {Name="Bob", Age=23},
                new Person{Name="Tim", Age=25}
            };
        }

        public IActionResult OnGet(string name)
        {
            Person = people.FirstOrDefault(p => p.Name == name);
            if (Person == null)
                return NotFound("Такого пользователя не существует");

            return Page();
        }
    }
}

Метод OnGet возвращает IActionResult. В зависимости от того, найден ли пользователь, этот IActionResult будет представлять либо NotFoundResult, либо PageResult. Причем метод Page() возвращает текущую страницу, как если бы у нас был бы просто определен метод OnGet с типом void:

public void OnGet(string name)
{
	Person = people.FirstOrDefault(p => p.Name == name);
}

И на самой странице Razor выводится полученный объект:

@page

@model PersonModel

<h2>Информация о пользователе</h2>
<p>Name = @Model.Person?.Name</p>
<p>Age = @Model.Person?.Age</p>
Result Types in Razor Pages in ASP.NET Core
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850