Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Por Microsoft
Aproveche las ventajas del enlazador de modelos de anotación de datos para realizar la validación dentro de una aplicación MVC de ASP.NET. Obtenga información sobre cómo usar los distintos tipos de atributos de validador y trabajar con ellos en Microsoft Entity Framework.
En este tutorial, aprenderá a usar los validadores de anotación de datos para realizar la validación en una aplicación MVC de ASP.NET. La ventaja de usar los validadores de anotación de datos es que permiten realizar la validación simplemente agregando uno o varios atributos, como el atributo Required o StringLength, a una propiedad de clase.
Es importante comprender que el enlazador de modelos de anotaciones de datos no es una parte oficial del marco de MVC de Microsoft ASP.NET. Aunque el enlazador de modelos de anotaciones de datos fue creado por el equipo de MVC de Microsoft ASP.NET, Microsoft no ofrece soporte técnico oficial del producto para el enlazador de modelos de anotaciones de datos descrito y utilizado en este tutorial.
Uso del enlazador de modelos de anotación de datos
Para usar el enlazador de modelos de anotaciones de datos en una aplicación MVC de ASP.NET, primero debe agregar una referencia al ensamblado Microsoft.Web.Mvc.DataAnnotations.dll y al ensamblado System.ComponentModel.DataAnnotations.dll. Seleccione la opción de menú Proyecto, Agregar referencia. A continuación, haga clic en la pestaña Examinar y vaya a la ubicación donde descargó (y descomprimió) el ejemplo de enlazador de modelos de anotaciones de datos (ver figura 1).
Figura 1: Adición de una referencia al enlazador de modelos de anotaciones de datos (haga clic para ver la imagen a tamaño completo)
Seleccione tanto el ensamblado Microsoft.Web.Mvc.DataAnnotations.dll como el ensamblado System.ComponentModel.DataAnnotations.dll y haga clic en el botón Aceptar.
No puede usar el ensamblado System.ComponentModel.DataAnnotations.dll incluido con .NET Framework Service Pack 1 con el enlazador de modelos de anotaciones de datos. Debe usar la versión del ensamblado System.ComponentModel.DataAnnotations.dll incluida con la descarga del ejemplo de enlazador de modelos de anotaciones de datos.
Por último, debe registrar el enlazador de modelos de anotaciones de datos en el archivo Global.asax. Agregue la siguiente línea de código al controlador de eventos de Application_Start() para que el método Application_Start() tenga este aspecto:
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
ModelBinders.Binders.DefaultBinder = new Microsoft.Web.Mvc.DataAnnotations.DataAnnotationsModelBinder();
}
Esta línea de código registra ataAnnotationsModelBinder como enlazador de modelos predeterminado para toda la aplicación MVC de ASP.NET.
Uso de los atributos del validador de anotación de datos
Al usar el enlazador de modelos de anotaciones de datos, se usan atributos de validador para realizar la validación. El espacio de nombres System.ComponentModel.DataAnnotations incluye los siguientes atributos de validador:
- Range: permite validar si el valor de una propiedad está comprendido entre un intervalo de valores especificado.
- RegularExpression: permite validar si el valor de una propiedad coincide con un patrón de expresión regular especificado.
- Required: permite marcar una propiedad como obligatoria.
- StringLength: permite especificar una longitud máxima para una propiedad de cadena.
- Validation: clase base para todos los atributos de validador.
Nota:
Si ninguno de los validadores estándar satisface sus necesidades de validación, siempre tiene la opción de crear un atributo de validador personalizado heredando un nuevo atributo de validador del atributo base Validation.
La clase Product de la lista 1 muestra cómo usar estos atributos de validador. Las propiedades Name, Description y UnitPrice están marcadas como obligatorias. La propiedad Name debe tener una longitud de cadena inferior a 10 caracteres. Por último, la propiedad UnitPrice debe coincidir con un patrón de expresión regular que representa una cantidad de moneda.
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
namespace MvcApplication1.Models
{
public class Product
{
public int Id { get; set; }
[Required]
[StringLength(10)]
public string Name { get; set; }
[Required]
public string Description { get; set; }
[DisplayName("Price")]
[RegularExpression(@"^\$?\d+(\.(\d{2}))?$")]
public decimal UnitPrice { get; set; }
}
}
Lista 1: Models\Product.cs
La clase Product muestra cómo usar un atributo adicional: el atributo DisplayName. El atributo DisplayName permite modificar el nombre de la propiedad cuando se muestra la propiedad en un mensaje de error. En lugar de mostrar el mensaje de error "El campo UnitPrice es obligatorio", puede mostrar el mensaje de error "El campo Precio es obligatorio".
Nota:
Si desea personalizar completamente el mensaje de error que muestra un validador, puede asignar un mensaje de error personalizado a la propiedad ErrorMessage del validador de la siguiente manera: <Required(ErrorMessage:="This field needs a value!")>
Puede usar la clase Product de la lista 1 con la acción del controlador Create() de la lista 2. Esta acción del controlador vuelve a mostrar la vista Create cuando el estado del modelo contiene errores.
using System.Web.Mvc;
using MvcApplication1.Models;
namespace MvcApplication1.Controllers
{
public class ProductController : Controller
{
//
// GET: /Product/Create
public ActionResult Create()
{
return View();
}
//
// POST: /Product/Create
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create([Bind(Exclude="Id")]Product productToCreate)
{
if (!ModelState.IsValid)
return View();
// TODO: Add insert logic here
return RedirectToAction("Index");
}
}
}
Lista 2: Controllers\ProductController.vb
Por último, puede crear la vista de la lista 3; para ello, haga clic con el botón derecho en la acción Create() y seleccione la opción de menú Agregar vista. Cree una vista fuertemente tipada con la clase Product como clase de modelo. Seleccione Crear en la lista desplegable de contenido de la vista (ver figura 2).
Figura 2: Adición de la vista Create
<%@ Page Title="" Language="C#" MasterPageFile="Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MvcApplication1.Models.Product>" %>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>Create</h2>
<%= Html.ValidationSummary("Create was unsuccessful. Please correct the errors and try again.") %>
<% using (Html.BeginForm()) {%>
<fieldset>
<legend>Fields</legend>
<p>
<label for="Name">Name:</label>
<%= Html.TextBox("Name") %>
<%= Html.ValidationMessage("Name", "*") %>
</p>
<p>
<label for="Description">Description:</label>
<%= Html.TextBox("Description") %>
<%= Html.ValidationMessage("Description", "*") %>
</p>
<p>
<label for="UnitPrice">Price:</label>
<%= Html.TextBox("UnitPrice") %>
<%= Html.ValidationMessage("UnitPrice", "*") %>
</p>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
<% } %>
<div>
<%=Html.ActionLink("Back to List", "Index") %>
</div>
</asp:Content>
Lista 3: Views\Product\Create.aspx
Nota:
Quite el campo Id del formulario Create generado por la opción de menú Agregar vista. Dado que el campo Id corresponde a una columna de identidad, no desea permitir que los usuarios escriban un valor para este campo.
Si envía el formulario para crear un producto y no especifica valores para los campos obligatorios, se muestran los mensajes de error de validación de la figura 3.
Figura 3: Faltan campos obligatorios
Si escribe un importe de moneda no válido, se muestra el mensaje de error de la figura 4.
Figura 4: Importe de moneda no válido
Uso de validadores de anotación de datos con Entity Framework
Si usa Microsoft Entity Framework para generar las clases del modelo de datos, no puede aplicar los atributos de validador directamente a las clases. Dado que el diseñador de Entity Framework genera las clases de modelo, los cambios que realice en las clases de modelo se sobrescribirán la próxima vez que realice cambios en el diseñador.
Si desea usar los validadores con las clases generadas por Entity Framework, debe crear clases de metadatos. Los validadores se aplican a la clase de metadatos en lugar de aplicar los validadores a la clase real.
Por ejemplo, imagine que ha creado una clase Movie mediante Entity Framework (ver figura 5). Imagine, además, que desea que las propiedades del título de la película y el director sean obligatorias. En ese caso, puede crear la clase parcial y la clase de metadatos de la lista 4.
Figura 5: Clase Movie generada por Entity Framework
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
namespace MvcApplication1.Models
{
[MetadataType(typeof(MovieMetaData))]
public partial class Movie
{
}
public class MovieMetaData
{
[Required]
public object Title { get; set; }
[Required]
[StringLength(5)]
public object Director { get; set; }
[DisplayName("Date Released")]
[Required]
public object DateReleased { get; set; }
}
}
Lista 4: Models\Movie.cs
El archivo de la lista 4 contiene dos clases llamadas Movie y MovieMetaData. La clase Movie es una clase parcial. Corresponde a la clase parcial generada por Entity Framework que se encuentra en el archivo DataModel.Designer.vb.
Actualmente, .NET Framework no admite propiedades parciales. Por lo tanto, no hay ninguna manera de aplicar los atributos de validador a las propiedades de la clase Movie definida en el archivo DataModel.Designer.vb aplicando los atributos de validador a las propiedades de la clase Movie definidas en el archivo de la lista 4.
Observe que la clase parcial Movie está decorada con un atributo MetadataType que apunta a la clase MovieMetaData. La clase MovieMetaData contiene propiedades proxy para las propiedades de la clase Movie.
Los atributos de validador se aplican a las propiedades de la clase MovieMetaData. Las propiedades Title, Director y DateReleased están marcadas como propiedades obligatorias. A la propiedad Director se le debe asignar una cadena que contenga menos de 5 caracteres. Por último, el atributo DisplayName se aplica a la propiedad DateReleased para mostrar un mensaje de error como "El campo Fecha de publicación es obligatorio" en lugar del error "El campo DateReleased es obligatorio".
Nota:
Observe que las propiedades proxy de la clase MovieMetaData no tienen por qué representar los mismos tipos que las propiedades correspondientes de la clase Movie. Por ejemplo, la propiedad Director es una propiedad de cadena en la clase Movie y una propiedad de objeto en la clase MovieMetaData.
En la página de la figura 6, se muestran los mensajes de error devueltos al escribir valores no válidos para las propiedades de Movie.
Figura 6: Uso de validadores con Entity Framework (haga clic para ver la imagen de tamaño completo)
Resumen
En este tutorial, ha aprendido cómo aprovechar las ventajas del enlazador de modelos de anotación de datos para realizar la validación dentro de una aplicación MVC de ASP.NET. Ha aprendido a usar los distintos tipos de atributos de validador, como los atributos Required y StringLength. También ha aprendido a usar estos atributos al trabajar con Microsoft Entity Framework.