Condividi tramite


Procedura: personalizzare la convalida dei campi dati nel modello di dati

Aggiornamento: Luglio 2008

ASP.NET Dynamic Data consente di personalizzare ed estendere la convalida dei dati al modello di dati. In questo argomento viene illustrato come aggiungere la convalida dei campi dati nel modello di dati nei seguenti modi:

  • Personalizzazione della convalida di singoli campi dati mediante l'applicazione degli attributi System.ComponentModel.DataAnnotations di Dynamic Data ai campi. Questi attributi definiscono criteri comuni di convalida, quali il controllo degli intervalli e i campi obbligatori. Tale approccio consente di utilizzare controlli di convalida predefiniti con una quantità minima di codifica. È necessario utilizzare questo approccio quando si desidera applicare una convalida aggiuntiva a quanto già fornito da Dynamic Data e gli attributi System.ComponentModel.DataAnnotations predefiniti sono sufficienti per le proprie esigenze.

    Nota:

    È anche possibile creare attributi di convalida personalizzati, in modo da espandere la convalida fornita dagli attributi System.ComponentModel.DataAnnotations. Tale operazione è utile se gli attributi disponibili non soddisfano i requisiti di convalida per uno specifico campo dati. Per ulteriori informazioni, vedere la classe Procedura: personalizzare la convalida dei campi dati nel modello dati mediante gli attributi personalizzati.

  • Personalizzazione della convalida di un singolo campo dati mediante l'override del metodo di classe parziale che elabora le modifiche per tale campo dati o mediante la gestione di un evento corrispondente. Questo approccio consente di aggiungere la convalida e la logica di business per un singolo campo.

  • Personalizzazione della convalida di qualsiasi campo dati mediante l'override del metodo OnValidate o la gestione dell'evento Validate. Questo metodo viene chiamato durante l'elaborazione di qualsiasi campo dati nella tabella. Tale approccio è più generale rispetto all'aggiunta della convalida per un singolo campo ed è utile quando è possibile applicare la stessa logica di convalida a più campi dati. Consente inoltre di eseguire controlli di convalida che interessano più campi.

Tutte le eccezioni di convalida generate nel modello di dati vengono rilevate dal controllo DynamicValidator. Se una pagina contiene un controllo DynamicValidator, l'errore può essere visualizzato nella pagina.

  • Per tutti i controlli di convalida aggiunti al modello di dati, è necessario creare una classe parziale che estenda la classe di tabella nel modello di dati. A tale classe parziale vengono quindi aggiunti i controlli di convalida.

Eseguire un esempio in linea di questa funzionalità.

Creazione di una classe parziale per la convalida

Prima di poter personalizzare la convalida al livello del modello di dati, è necessario implementare una classe parziale che estenda questo modello. In tal modo, sarà possibile effettuare le seguenti operazioni:

  • Personalizzazione della convalida mediante l'aggiunta di informazioni sui metadati tramite attributi.

  • Personalizzazione della convalida mediante l'implementazione di metodi di classe parziale che consentono di creare una logica di convalida personalizzata.

Per creare una classe parziale per la convalida

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sulla cartella App_Code, quindi scegliere Aggiungi nuovo elemento.

  2. In Modelli Visual Studio installati fare clic su Class.

    Nella casella Nome immettere il nome della tabella dati per cui si desidera aggiungere la convalida.

    Il nome della classe deve corrispondere al nome della classe di entità che rappresenta la tabella. Ad esempio, se si desidera aggiungere la convalida per la tabella Customers, è necessario assegnare al file il nome Customer.cs in Visual C# e Customer.vb in Visual Basic e assegnare alla classe il nome Customer.

  3. Aggiungere la parola chiave Partial in Visual Basic o la parola chiave partial in Visual C# alla definizione della classe per renderla una classe parziale. 

    Nell'esempio riportato di seguito viene illustrata la dichiarazione di classe aggiornata.

    public partial class Customer {
    
    }
    
    Partial Public Class Customer
    
    End Class
    
  4. Se si crea la classe in Visual C#, eliminare il costruttore predefinito.

  5. Aggiungere riferimenti agli spazi dei nomi System.Web.DynamicData e System.ComponentModel.DataAnnotations utilizzando la parola chiave Imports in Visual Basic o la parola chiave using in Visual C#, come illustrato nell'esempio seguente:

    using System.Web.DynamicData;
    using System.ComponentModel.DataAnnotations;
    
    Imports System.Web.DynamicData
    Imports System.ComponentModel.DataAnnotations
    
  6. Nello stesso file creare una seconda classe che fungerà da classe di metadati associata. È possibile utilizzare qualsiasi nome per la classe, purché sia valido e non già utilizzato.

    Nell'esempio riportato di seguito viene illustrata la dichiarazione di una classe di metadati.

    [C#]

    public class CustomerMetadata
    {
    
    }
    
    Public Class CustomerMetadata 
    
    End Class
    

    La classe di metadati associata fornisce un oggetto a cui è possibile applicare attributi di convalida.

  7. Applicare l'attributo MetadataTypeAttribute alla definizione della classe parziale. Per il parametro dell'attributo utilizzare il nome della classe di metadati associata creata nel passaggio precedente.

    Nell'esempio riportato di seguito viene illustrata la definizione della classe parziale a cui è stato aggiunto l'attributo.

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

Personalizzazione della convalida mediante attributi

In questa sezione viene illustrato come personalizzare la convalida mediante regole di convalida predefinite fornite dagli attributi System.ComponentModel.DataAnnotations di Dynamic Data.

Per convalidare un campo dati specifico mediante gli attributi di convalida

  1. Nella classe di metadati creare una proprietà o un campo il cui nome corrisponda al campo dati da convalidare.

  2. Applicare alla proprietà uno degli attributi nello spazio dei nomi System.ComponentModel.DataAnnotations.

    Nell'esempio riportato di seguito viene illustrato come applicare l'attributo System.ComponentModel.DataAnnotations.RequiredAttribute al campo dati Title nella classe di metadati associata. Se un utente immette una stringa vuota, il metodo IsValid genera un'eccezione di convalida e un messaggio di errore.

    Nota:

    Applicando l'attributo RequiredAttribute, si richiede agli utenti di immettere un valore anche se questo non è richiesto dal database.

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

Personalizzazione della convalida di un singolo campo dati mediante un metodo di classe parziale

In questa sezione viene illustrato come personalizzare la convalida mediante l'override di un metodo di classe parziale che elabora le modifiche apportate a un singolo campo dati. Questo tipo di convalida consente di creare regole personalizzate per l'esecuzione della convalida anziché basarsi sui controlli di convalida incorporati di Dynamic Data implementati negli attributi System.ComponentModel.DataAnnotations.

Per convalidare un campo dati specifico mediante un metodo di classe parziale

  1. Eseguire l'override del metodo di classe parziale che elabora le modifiche apportate al campo dati.

  2. Aggiungere la logica di convalida personalizzata.

    Nell'esempio riportato di seguito viene illustrato come eseguire l'override del metodo OnTitleChanging in una classe Customer parziale. Il metodo viene chiamato quando viene modificato il campo Title della tabella dati Customer. Nel codice dell'esempio viene controllato che il nuovo titolo immesso dall'utente inizi con una maiuscola. Se i dati non superano la convalida, il metodo genera un'eccezione. Il valore da convalidare viene passato al metodo come unico parametro, tipizzato in modo da corrispondere al tipo di dati da convalidare.

    Nota:

    Tutte le eccezioni di convalida generate nel modello di dati vengono rilevate dal controllo DynamicValidator. Se una pagina contiene un controllo DynamicValidator, l'errore può essere visualizzato nella pagina.

    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
    

Personalizzazione della convalida di tutti i campi dati mediante un metodo di classe parziale

In questa sezione viene illustrato come personalizzare la convalida mediante l'override del metodo di classe parziale che elabora le modifiche apportate a qualsiasi campo dati in una tabella. Questo tipo di convalida consente di creare regole personalizzate per l'esecuzione della convalida anziché basarsi sui controlli di convalida incorporati di Dynamic Data implementati negli attributi System.ComponentModel.DataAnnotations. È utile quando è possibile applicare la stessa logica di convalida a più campi dati. Consente inoltre di eseguire controlli di convalida che interessano più campi.

Per convalidare qualsiasi campo dati mediante un metodo di classe parziale

  1. Eseguire l'override del metodo di classe parziale OnValidate richiamato quando vengono apportate modifiche a un campo dati nella tabella.

  2. Aggiungere la logica di convalida personalizzata.

    Nell'esempio che segue viene illustrato come eseguire l'override del metodo OnValidate. In questo codice di esempio viene controllato che il nome e il cognome immessi dall'utente inizino con una maiuscola. Se i dati non superano la convalida, il metodo genera un'eccezione.

    Nota:

    Tutte le eccezioni di convalida generate nel modello di dati vengono rilevate dal controllo DynamicValidator. Se una pagina contiene un controllo DynamicValidator, l'errore può essere visualizzato nella pagina.

    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
    

Esempio

Nell'esempio viene illustrato come utilizzare l'attributo RequiredAttribute per convalidare i dati Title della tabella Customer. Viene utilizzato il metodo di classe parziale OnValidate per assicurarsi che i valori immessi dall'utente per i campi dati Title, FirstName e LastName inizino con una maiuscola. Viene utilizzato anche il metodo di classe parziale OnOderQtyChanging per assicurarsi che il valore immesso dall'utente per il campo dati OrderQty della tabella SalesOrderDetails sia maggiore di un valore minimo specificato.

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");

    }
}

Compilazione del codice

Per compilare il codice di esempio, è necessario quanto segue:

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

  • Database di esempio AdventureWorksLT. Per informazioni su come scaricare e installare il database di esempio di SQL Server, vedere Microsoft SQL Server Product Samples: Database (informazioni in lingua inglese) nel sito Web CodePlex. Assicurarsi di installare la versione del database di esempio appropriata per la versione di SQL Server in esecuzione (Microsoft SQL Server 2005 o Microsoft SQL Server 2008).

Sito Web Dynamic Data, che consente di creare un contesto dati per il database nonché la classe che contiene il campo dati da personalizzare e i metodi di cui eseguire l'override. Per ulteriori informazioni, vedere la classe Walkthrough: Creating a New Dynamic Data Web Site Using Scaffolding.

Vedere anche

Concetti

Cenni preliminari sui modelli di campo di ASP.NET Dynamic Data

Cenni preliminari sul modello di ASP.NET Dynamic Data

Cenni preliminari su ASP.NET Dynamic Data

Riferimenti

RequiredAttribute

DynamicValidator

Classi e metodi parziali (Guida per programmatori C#)

Cronologia delle modifiche

Date

History

Motivo

Luglio 2008

Argomento aggiunto.

Modifica di funzionalità in SP1.