Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7
Все ранее рассмотренные методы 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>