Control de interacciones en métodos de controlador PageModel
En esta unidad, revisará la estructura de una clase PageModel de página de Razor y sus componentes. Aprenderá cómo interactúan los controladores de página con nuestra página de Razor. Por último, recorrerá el modelo Pizza y sus anotaciones de datos que controlan la validación del lado cliente y del lado servidor.
Examen de la estructura de una clase PageModel de Razor Pages
Un archivo de clase PageModel nuevo contiene el código de C# siguiente:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace RazorPagesPizza.Pages
{
public class PizzaModel : PageModel
{
public void OnGet()
{
}
}
}
El archivo de clase PageModel de una página de Razor define controladores de página para las solicitudes HTTP enviadas a la página y para los datos que se usan para representarla. PageModel mantiene esos intereses separados de la página de Razor, para que la aplicación sea más modular y más fácil de mantener. Por convención, la clase PageModel se denomina [PageName]Model y está en el mismo espacio de nombres que la página de Razor. En este caso, la clase PizzaModel se encuentra en el espacio de nombres RazorPagesPizza.Pages.
Actualmente, la clase PizzaModel controla la solicitud HTTP GET con un controlador de página OnGet vacío. Puede agregar controladores para cualquier verbo HTTP. Los controladores más comunes son:
OnGetpara inicializar el estado necesario para la página.OnPostpara controlar los envíos del formulario.
La página Pizza contiene un formulario y, por tanto, requiere un controlador de página HTTP POST.
Controladores de página HTTP POST en un PageModel
El controlador de página OnPostAsync debe realizar las tareas siguientes para esta aplicación:
- Comprobar que los datos enviados por el usuario publicados en
PageModelson válidos. - Si los cambios intentados en
PageModelno son válidos, se vuelve a mostrar la página Pizza al usuario. Se muestra un mensaje para clarificar los requisitos de entrada. - Si la actualización de
PageModeles válida, los cambios de datos se pasan a un servicio denominadoPizzaService. ElPizzaServicecontrolará el problema al conservar los datos.
Enlace del modelo
La clase PizzaModel necesita acceder al modelo Pizza. Validará y pasará las entradas Pizza del formulario Pizza. Para ello, usa el atributo [BindProperty] en el código siguiente:
[BindProperty]
public Pizza NewPizza { get; set; }
El enlace a las propiedades puede reducir la cantidad de código que hay que escribir. Para reducir el código, el enlace usa la misma propiedad para representar campos como en <input asp-for="Pizza.Name">.
Validación de modelos del lado servidor integrada mediante anotaciones de datos de ASP.NET Core
La validación y enlace de modelos están disponibles cuando se crea una aplicación web ASP.NET Core. Ambos se producen de manera automática antes de la ejecución de un controlador de página. Por lo tanto, el controlador de página OnPostAsync solo necesita comprobar la salida de esa validación.
if (!ModelState.IsValid)
{
return Page();
}
En el código anterior, ModelState representa los errores del enlace y la validación del modelo. Si ModelState no es válido, se vuelve a mostrar la página Pizza al usuario. En la unidad anterior, vio cómo la página de Razor Pizza usa la validación de entradas de formulario integrada de ASP.NET Core del lado cliente para proporcionar al usuario información sobre la validación de entradas.
Si ModelState es válido, el controlador de página OnPostAsync llama a una instancia de PizzaService. PizzaService es responsable de almacenar la información; en este caso, mediante un almacén de datos en memoria.
Definición de reglas de validación para el modelo Pizza mediante anotaciones de datos
En este proyecto se usa un archivo de modelo central Pizza.cs para la validación y las operaciones del modelo Pizza. Se usa en todas las instancias de PageModels de la página de Razor implicadas en la interfaz de usuario para las operaciones CRUD de Pizza y se usa para validar los datos de Pizza recibidos de la API web. Por convención, se almacena en el directorio Models. El espacio de nombres del modelo Pizza es RazorPagesPizza.Models.
La nueva clase PizzaModel ha obtenido acceso a todos los tipos de modelo definidos en el espacio de nombres RazorPagesPizza.Models, incluido el modelo Pizza, con la directiva using siguiente:
using RazorPagesPizza.Models;
Examine la clase de modelo Pizza:
using System;
using System.ComponentModel.DataAnnotations;
namespace RazorPagesPizza.Models
{
public class Pizza
{
public int Id { get; set; }
[Required]
public string Name { get; set; }
public PizzaSize Size { get; set; }
public bool IsGlutenFree { get; set; }
[Range(0.01, 9999.99)]
public decimal Price { get; set; }
}
public enum PizzaSize { Small, Medium, Large }
}
Las anotaciones de datos son atributos que especifican el comportamiento que se quiere aplicar en las propiedades del modelo a las que se aplican.
La clase Pizza utiliza:
- El atributo
[Required]para indicar que una propiedad debe tener un valor. - El atributo
[Range]para restringir un valor a un intervalo específico.
Si decide aplicar más reglas de validación, puede modificar fácilmente los atributos en un solo lugar, el modelo Pizza, sin necesidad de modificar ninguno de los archivos de clase PageModel del proyecto. Una ventaja importante.
Hay un conjunto completo de atributos de anotación de datos disponible en el espacio de nombres System.ComponentModel.DataAnnotations. Para el ámbito de este módulo, se proporciona un ejemplo simplificado.
El modelo Pizza como un objeto de transferencia de datos
El modelo Pizza también actúa como un objeto de transferencia de datos (DTO). Un DTO es un objeto que define los datos que se enviarán a través de la red, en este caso a la API web. En una versión más avanzada de esta aplicación, la clase PizzaService del proyecto RazorPagesPizza usaría el modelo Pizza como un DTO que define datos válidos de Pizza que se pueden enviar y recibir desde la API web o la base de datos de respaldo.
A continuación, actualizará la interacción PizzaModel con la clase PizzaService para enumerar las pizzas existentes y crear otras nuevas.
Comprobar los conocimientos
¿Necesita ayuda? Consulte nuestra guía de solución de problemas o notifique un problema para enviar comentarios específicos.