Compartir a través de


Cómo: Personalizar la validación de campos de datos en el modelo de datos

Actualización: Julio de 2008

Los datos dinámicos de ASP.NET permiten personalizar y extender la validación de datos al modelo de datos. En este tema se explica cómo agregar la validación de campos de datos del modelo de datos de las siguientes maneras:

  • Personalizar la validación de campos de datos individuales aplicando a los campos los atributos System.ComponentModel.DataAnnotations de los datos dinámicos. Estos atributos definen modelos de la validación comunes, como la comprobación de intervalos y los campos obligatorios. Este enfoque le permite utilizar las comprobaciones de la validación predefinidas con muy un poco codificación. Debería utilizar este enfoque si desea aplicar una validación adicional a la que ya proporcionan los datos dinámicos, y los atributos System.ComponentModel.DataAnnotations predeterminados son suficientes para sus requisitos.

    Nota:

    También puede crear atributos de validación personalizados. Esto permite expandir la validación que proporcionan los atributos System.ComponentModel.DataAnnotations. Resulta útil si los atributos disponibles no cumplen los requisitos de validación de un campo de datos específico. Para obtener más información, vea Cómo: Personalizar la validación de campos de datos en el modelo de datos mediante atributos personalizados.

  • Personalizar la validación de un campo de datos individual invalidando el método de clase parcial que procesa los cambios de dicho campo de datos (o controlando el evento correspondiente). Este enfoque permite agregar validación y lógica empresarial a un campo individual.

  • Personalizar la validación de cualquier campo de datos invalidando el método OnValidate (o controlando el evento Validate). Se llama a este método cuando se procesa cualquier campo de datos de la tabla. Este enfoque es más general que agregar la validación para un campo individual. Resulta útil si se puede aplicar la misma lógica de validación a más de un campo de datos. También permite realizar comprobaciones de validación que implican varios campos.

El control DynamicValidator detecta cualquier excepción de validación que se produzca en el modelo de datos. Si una página contiene un control DynamicValidator, el error se puede mostrar en la página.

  • Para todas las comprobaciones de validación que agregue al modelo de datos, debe crear una clase parcial que extienda la clase de tabla del modelo de datos. A continuación, debe agregar las comprobaciones de validación a la clase parcial.

Ejecute un ejemplo en línea de esta característica.

Crear un clase parcial para la validación

Para poder personalizar la validación en la capa del modelo de datos, debe implementar una clase parcial que extienda el modelo de datos. Esto permite hacer lo siguiente:

  • Personalizar la validación agregando información de metadatos a través de atributos.

  • Personalizar la validación implementando métodos de clase parcial que le permiten crear su propia lógica de validación.

Para crear la clase parcial para la validación

  1. En el Explorador de soluciones, haga clic con el botón secundario en la carpeta App_Code y, a continuación, haga clic en Agregar nuevo elemento.

  2. En Plantillas instaladas de Visual Studio, haga clic en Clase.

    En el cuadro Nombre, escriba el nombre de la tabla de datos para la que desea agregar la validación.

    El nombre de clase debe coincidir con el nombre de la clase de entidad que representa la tabla. Por ejemplo, si desea agregar la validación para la tabla Customers, debe denominar al archivo Customer.cs en Visual C# o Customer.vb en Visual Basic y denominar a la clase Customer.

  3. Agregue la palabra clave Partial de Visual Basic o la palabra clave partial de Visual C# a la definición de clase para convertirla en una clase parcial. 

    En el ejemplo siguiente se muestra la declaración de clase actualizada.

    public partial class Customer {
    
    }
    
    Partial Public Class Customer
    
    End Class
    
  4. Si está creando la clase en Visual C#, elimine el constructor predeterminado.

  5. Agregue referencias a los espacios de nombres System.Web.DynamicData y System.ComponentModel.DataAnnotations utilizando la palabra clave Imports de Visual Basic o la palabra clave using de Visual C#, tal y como se muestra en el siguiente ejemplo:

    using System.Web.DynamicData;
    using System.ComponentModel.DataAnnotations;
    
    Imports System.Web.DynamicData
    Imports System.ComponentModel.DataAnnotations
    
  6. En el mismo archivo, cree una segunda clase que actuará como la clase de metadatos asociada. Puede utilizar cualquier nombre para la clase que sea un nombre de clase válido y aún no se haya utilizado.

    En el ejemplo siguiente se muestra una declaración de clase de metadatos.

    [C#]

    public class CustomerMetadata
    {
    
    }
    
    Public Class CustomerMetadata 
    
    End Class
    

    La clase de metadatos asociada proporciona un objeto al que puede aplicar atributos de validación.

  7. Aplique el atributo MetadataTypeAttribute a la definición de clase parcial. Para el parámetro del atributo, utilice el nombre de la clase de metadatos asociada que creó en el paso anterior.

    En el ejemplo siguiente se muestra la definición de clase parcial con el atributo agregado.

    [MetadataType(typeof(CustomerMetadata))]
    public partial class Customer {
    
    }
    
    <MetadataType(GetType(CustomerMetadata))> _
    Partial Public Class Customer
    
    End Class
    

Personalizar la validación utilizando atributos

En esta sección se muestra cómo personalizar la validación utilizando reglas de validación predeterminadas proporcionadas por los atributos System.ComponentModel.DataAnnotations de los datos dinámicos.

Para validar un campo de datos concreto utilizando atributos de validación

  1. En la clase de metadatos, cree una propiedad o campo cuyo nombre corresponda al campo de datos que desea validar

  2. Aplique uno de los atributos del espacio de nombres System.ComponentModel.DataAnnotations a la propiedad.

    En el ejemplo siguiente se muestra cómo aplicar el atributo System.ComponentModel.DataAnnotations.RequiredAttribute al campo de datos Title de la clase de metadatos asociada. Si un usuario escribe una cadena vacía, el método IsValid produce una excepción de validación y genera un mensaje de error.

    Nota:

    Al aplicar el atributo RequiredAttribute, exige a los usuarios que especifiquen un valor, aun cuando la base de datos no lo requiere.

    public class CustomerMetadata
    {
      [Required()]
      public object Title;
    }
    
    Public Class CustomerMetadata 
      <Required()> _
      Public Title As Object
    End Class
    

Personalizar la validación de un campo de datos individual utilizando un método de clase parcial

En esta sección se muestra cómo personalizar la validación invalidando un método de clase parcial que procesa los cambios realizados en un campo de datos individual. Este tipo de validación le permite crear sus propias reglas para realizar la validación en lugar de confiar en las comprobaciones de validación de los datos dinámicos integradas que se implementan en los atributos System.ComponentModel.DataAnnotations.

Para validar un campo de datos específico utilizando un método de clase parcial

  1. Invalide el método de clase parcial que procesa los cambios realizados en el campo de datos.

  2. Agregue su lógica de validación personalizada.

    En el ejemplo siguiente se muestra cómo invalidar el método OnTitleChanging en una clase Customer parcial. A este método se le llama cuando se cambia el campo Title de la tabla de datos Customer. El código del ejemplo comprueba que el nuevo título escrito por el usuario empieza por una letra mayúscula. Si los datos no pasan la validación, el método produce una excepción. El valor que se va a validar se pasa al método como el único parámetro. El parámetro se escribe para que coincida con el tipo de datos de los datos que se desean validar.

    Nota:

    El control DynamicValidator detecta cualquier excepción de validación que se produzca en el modelo de datos. Si una página contiene un control DynamicValidator, el error se puede mostrar en la página.

    public partial class Customer 
    {
      partial void OnTitleChanging(string value) 
      {
        if (!Char.IsUpper(value[0])) {
          throw new ValidationException(
           "Title must start with an uppercase letter.");}
        }
    }
    
    Public Partial Class Customer
      Private Sub OnTitleChanging(ByVal value As String)
        If Not [Char].IsUpper(value(0)) Then
          Throw New ValidationException( _
            "Title must start with an uppercase letter.")
        End If
      End Sub
    End Class
    

Personalizar la validación de todos los campos de datos utilizando un método de clase parcial

En esta sección se muestra cómo personalizar la validación invalidando el método de clase parcial que procesa los cambios realizados en cualquier campo de datos de una tabla. Este tipo de validación le permite crear sus propias reglas para realizar la validación en lugar de confiar en las comprobaciones de validación de los datos dinámicos integradas que se implementan en los atributos System.ComponentModel.DataAnnotations. Resulta útil si se puede aplicar la misma lógica de validación a más de un campo de datos. También permite realizar comprobaciones de validación que implican varios campos.

Para validar cualquier campo de datos mediante un método de clase parcial

  1. Invalide el método de clase parcial OnValidate que se invoca cuando se realizan cambios en cualquier campo de datos de la tabla.

  2. Agregue su lógica de validación personalizada.

    En el ejemplo siguiente se muestra cómo se reemplaza el método OnValidate. Este código de ejemplo comprueba que el nombre y apellido escritos por el usuario empiezan por una letra mayúscula. Si los datos no pasan la validación, el método produce una excepción.

    Nota:

    El control DynamicValidator detecta cualquier excepción de validación que se produzca en el modelo de datos. Si una página contiene un control DynamicValidator, el error se puede mostrar en la página.

    partial void OnValidate(
        System.Data.Linq.ChangeAction action)
        {
            if (!Char.IsUpper(this._LastName[0]) || 
                !Char.IsUpper(this._FirstName[0]))
              throw new  ValidationException(
                 "Name must start with an uppercase letter.");
            }
    
    Private Sub OnValidate(ByVal action As _  
           System.Data.Linq.ChangeAction)
        If Not [Char].IsUpper(Me._LastName(0)) OrElse _
                Not [Char].IsUpper(Me._FirstName(0)) Then
            Throw New ValidationException( _
                "Name must start with an uppercase letter.")
        End If
    End Sub
    

Ejemplo

En el ejemplo se muestra cómo utilizar el atributo RequiredAttribute para validar los datos del campo Title de la tabla Customer. Utiliza el método de clase parcial OnValidate para asegurarse de que los valores especificados por el usuario para los campos de datos Title, FirstName y LastName empiezan por una letra mayúscula. También utiliza el método de clase parcial OnOderQtyChanging para asegurarse de que el valor escrito por el usuario para el campo de datos OrderQty de la tabla SalesOrderDetails es mayor que un valor mínimo especificado.

Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Web
Imports System.Web.DynamicData
Imports System.ComponentModel.DataAnnotations

<MetadataType(GetType(CustomerMetadata))> _
Partial Public Class Customer


    Private Sub OnValidate(ByVal action As System.Data.Linq.ChangeAction)
        If Not Char.IsUpper(Me._LastName(0)) _
        OrElse Not Char.IsUpper(Me._FirstName(0)) _
        OrElse Not Char.IsUpper(Me._Title(0)) Then
            Throw New ValidationException( _
               "Data value must start with an uppercase letter.")
        End If
    End Sub


End Class

Public Class CustomerMetadata
    <Required()> _
    Public Title As Object

End Class
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.DynamicData;
using System.ComponentModel.DataAnnotations;

[MetadataType(typeof(CustomerMetadata))]
public partial class Customer
{


    partial void OnValidate(System.Data.Linq.ChangeAction action)
    {
        if (!char.IsUpper(this._LastName[0]) ||
            !char.IsUpper(this._FirstName[0])  ||
            !char.IsUpper(this._Title[0]))
            throw new ValidationException(
               "Data value must start with an uppercase letter.");
    }


}

public class CustomerMetadata
{
    [Required()]
    public object Title;

}
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Web
Imports System.Web.DynamicData
Imports System.ComponentModel.DataAnnotations

Partial Public Class SalesOrderDetail
    Private Sub OnOrderQtyChanging(ByVal value As Short)
        If value < 100 Then
            Throw New ValidationException( _
               "Quantity is less than the allowed minimum of 100.")
        End If
    End Sub
End Class

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.DynamicData;
using System.ComponentModel.DataAnnotations;

public partial class SalesOrderDetail
{
    partial void OnOrderQtyChanging(short value)
    {
        if (value < 100)
        {
            throw new ValidationException(
                "Quantity is less than the allowed minimum of 100.");
        }
    }
}

<%@ Page Language="VB" 
AutoEventWireup="true" CodeFile="CustomValidation.aspx.vb" 
Inherits="CustomValidation" %>


<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" >
    <title></title>
    <link href="~/Site.css" rel="stylesheet" type="text/css" />
</head>
<body>
     <h2>Example: <%=Title%></h2>

     <!-- Enable dynamic behavior. The GridView must be 
     registered with the manager. See code-behind file. -->
    <asp:DynamicDataManager ID="DynamicDataManager1" 
        AutoLoadForeignKeys="true" />


    <form id="form1" >

        <!-- Capture validation exceptions -->
        <asp:DynamicValidator ID="ValidatorID" ControlToValidate="GridView1" 
             /> 
        <asp:DynamicValidator ID="DynamicValidator1" ControlToValidate="GridView2" 
             /> 
        <table>
            <tr>
                <td align="left" valign="top" style="font-weight:bold">
                    Customize Validation Using the Table OnValidate 
                </td>
                <td>
                    <asp:GridView ID="GridView1" 
                         
                        DataSourceID="GridDataSource" 
                        AutoGenerateColumns="false"  
                        AutoGenerateEditButton="true"
                        AllowPaging="true" 
                        PageSize="5"
                        AllowSorting="true">
                        <Columns>
                            <asp:DynamicField DataField="Title" />
                            <asp:DynamicField DataField="FirstName" />
                            <asp:DynamicField DataField="LastName" />
                        </Columns>
                        <EmptyDataTemplate>
                            There are currently no items in this table.
                        </EmptyDataTemplate>
                    </asp:GridView>
                </td>
            </tr>
            <tr>
                <td align="left" valign="top" style="font-weight:bold">
                    Customize Validation Using OnOrderQtyChanging
                </td>
                <td>
                    <asp:GridView ID="GridView2" 
                         
                        DataSourceID="GridDataSource2" 
                        AutoGenerateColumns="false"  
                        AutoGenerateEditButton="true"
                        AllowPaging="true" 
                        PageSize="5"
                        AllowSorting="true">
                        <Columns>
                            <asp:DynamicField DataField="OrderQty" />
                        </Columns>
                        <EmptyDataTemplate>
                            There are currently no items in this table.
                        </EmptyDataTemplate>
                    </asp:GridView>
                </td>
            </tr>
        </table>

    </form>

    <!-- Connect to the database -->
    <asp:LinqDataSource ID="GridDataSource"   
         TableName="Customers" EnableUpdate="true"
        ContextTypeName="AdventureWorksLTDataContext">

    </asp:LinqDataSource>

     <!-- Connect to the database -->
    <asp:LinqDataSource ID="GridDataSource2"   
         TableName="SalesOrderDetails" EnableUpdate="true"
        ContextTypeName="AdventureWorksLTDataContext">

    </asp:LinqDataSource>
</body>
</html>
<%@ Page Language="C#" 
AutoEventWireup="true" CodeFile="CustomValidation.aspx.cs" 
Inherits="CustomValidation" %>


<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" >
    <title></title>
    <link href="~/Site.css" rel="stylesheet" type="text/css" />
</head>
<body>
     <h2>Example: <%=Title%></h2>

     <!-- Enable dynamic behavior. The GridView must be 
     registered with the manager. See code-behind file. -->
    <asp:DynamicDataManager ID="DynamicDataManager1" 
        AutoLoadForeignKeys="true" />


    <form id="form1" >

        <!-- Capture validation exceptions -->
        <asp:DynamicValidator ID="ValidatorID" ControlToValidate="GridView1" 
             /> 
        <asp:DynamicValidator ID="DynamicValidator1" ControlToValidate="GridView2" 
             /> 
        <table>
            <tr>
                <td align="left" valign="top" style="font-weight:bold">
                    Customize Validation Using the Table OnValidate 
                </td>
                <td>
                    <asp:GridView ID="GridView1" 
                         
                        DataSourceID="GridDataSource" 
                        AutoGenerateColumns="false"  
                        AutoGenerateEditButton="true"
                        AllowPaging="true" 
                        PageSize="5"
                        AllowSorting="true">
                        <Columns>
                            <asp:DynamicField DataField="Title" />
                            <asp:DynamicField DataField="FirstName" />
                            <asp:DynamicField DataField="LastName" />
                        </Columns>
                        <EmptyDataTemplate>
                            There are currently no items in this table.
                        </EmptyDataTemplate>
                    </asp:GridView>
                </td>
            </tr>
            <tr>
                <td align="left" valign="top" style="font-weight:bold">
                    Customize Validation Using OnOrderQtyChanging
                </td>
                <td>
                    <asp:GridView ID="GridView2" 
                         
                        DataSourceID="GridDataSource2" 
                        AutoGenerateColumns="false"  
                        AutoGenerateEditButton="true"
                        AllowPaging="true" 
                        PageSize="5"
                        AllowSorting="true">
                        <Columns>
                            <asp:DynamicField DataField="OrderQty" />
                        </Columns>
                        <EmptyDataTemplate>
                            There are currently no items in this table.
                        </EmptyDataTemplate>
                    </asp:GridView>
                </td>
            </tr>
        </table>

    </form>

    <!-- Connect to the database -->
    <asp:LinqDataSource ID="GridDataSource"   
         TableName="Customers" EnableUpdate="true"
        ContextTypeName="AdventureWorksLTDataContext">

    </asp:LinqDataSource>

     <!-- Connect to the database -->
    <asp:LinqDataSource ID="GridDataSource2"   
         TableName="SalesOrderDetails" EnableUpdate="true"
        ContextTypeName="AdventureWorksLTDataContext">

    </asp:LinqDataSource>
</body>
</html>
Imports System
Imports System.Collections
Imports System.Configuration
Imports System.Web.DynamicData

Partial Public Class CustomValidation
    Inherits System.Web.UI.Page
    Protected _table1 As MetaTable, _table2 As MetaTable

    Protected Sub Page_Init(ByVal sender As Object, ByVal e As EventArgs)
        ' Register data controls with the data manager.
        DynamicDataManager1.RegisterControl(GridView1)
        DynamicDataManager1.RegisterControl(GridView2)
    End Sub

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
        ' Get the table entities.
        _table1 = GridDataSource.GetTable()
        _table2 = GridDataSource2.GetTable()

        ' Assign title dynamically.
        Title = String.Concat("Customize Validation of the ", _
                              _table1.Name, " and ", _table2.Name, " Tables")

    End Sub
End Class
using System;
using System.Collections;
using System.Configuration;
using System.Web.DynamicData;

public partial class CustomValidation : System.Web.UI.Page
{
    protected MetaTable _table1, _table2;

    protected void Page_Init(object sender, EventArgs e)
    {
        // Register data controls with the data manager.
        DynamicDataManager1.RegisterControl(GridView1);
        DynamicDataManager1.RegisterControl(GridView2);
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        // Get the table entities.
        _table1 = GridDataSource.GetTable();
        _table2 = GridDataSource2.GetTable();

        // Assign title dynamically.
        Title = string.Concat("Customize Validation of the ",
            _table1.Name, " and ",  _table2.Name, " Tables");

    }
}

Compilar el código

Para compilar el código de ejemplo, necesita:

  • Microsoft Visual Studio 2008 Service Pack 1 o Visual Web Developer 2008 Express Service Pack 1.

  • La base de datos de ejemplo AdventureWorksLT. Para obtener información sobre la forma de descargar e instalar la base de datos de ejemplo de SQL Server, vea Microsoft SQL Server Product Samples: Database en el sitio CodePlex. Asegúrese de que instala la versión correcta de la base de datos de ejemplo para la versión de SQL Server que esté ejecutando (Microsoft SQL Server 2005 o Microsoft SQL Server 2008).

Un sitio web de datos dinámicos. De este modo, se puede crear un contexto de datos para la base de datos y crear la clase que contiene el campo de datos que se va a personalizar y los métodos que se van a invalidar. Para obtener más información, vea Walkthrough: Creating a New Dynamic Data Web Site Using Scaffolding.

Vea también

Conceptos

Información general sobre las plantillas de campos de datos dinámicos de ASP.NET

Información general sobre el modelo de datos dinámicos de ASP.NET

Información general sobre los datos dinámicos de ASP.NET

Referencia

RequiredAttribute

DynamicValidator

Clases y métodos parciales (Guía de programación de C#)

Historial de cambios

Fecha

Historial

Motivo

Julio de 2008

Se ha agregado un tema.

Cambio de características de SP1.