Sviluppo di un controllo di convalida

In questa sezione vengono descritte la convalida nel framework della pagina di ASP.NET e le modalità di sviluppo di una libreria di controlli di convalida.

Una convalida implica generalmente la verifica dei dati del form immessi dall'utente. Tuttavia, può anche richiamare altri tipi di verifica degli errori. Per fornire un'astrazione che comprenda scenari di convalida diversi, in .NET Framework viene definita l'interfaccia System.Web.UI.IValidator, in cui si trovano i membri seguenti:

public interface IValidator
{
   void Validate();
   string ErrorMessage {get; set;}
   bool IsValid {get; set;}
}
[Visual Basic]
Public Interface IValidator
   Sub Validate()
   Property ErrorMessage As String
   Property IsValid As Boolean
End Interface

Il metodo Validate esegue una logica di verifica degli errori e imposta la proprietà IsValid. La proprietà ErrorMessage contiene una stringa di errore inserita dallo sviluppatore di pagine.

La classe Page espone la proprietà Validators, che è un elenco di tutti i tipi IValidator nella pagina. Qualsiasi classe che implementi l'interfaccia IValidator è considerata una convalida e può essere aggiunta alla proprietà Validators della relativa pagina contenitore. Una pagina tiene traccia dello stato degli errori delle sue convalide e aggiorna di conseguenza lo stato complessivo degli errori.

I tipi più comuni di convalida sono i controlli di convalida che eseguono il rendering dell'interfaccia utente nel client per contrassegnare errori di input. Per informazioni sui controlli di convalida forniti con .NET Framework SDK, vedere Guida rapida di ASP.NET —> Web Form ASP.NET —> Convalida dei form dei controlli server. Nell'elenco che segue vengono riepilogate le caratteristiche dei controlli di convalida di .NET Framework. Questo elenco può essere utile per la creazione di una libreria di controlli di convalida.

  • I controlli di convalida rimangono separati dai controlli che convalidano: per partecipare alla convalida, un controllo server deve esporre una proprietà da convalidare contrassegnandola con l'attributo ValidationPropertyAttribute.
  • È possibile associare più controlli di convalida a un controllo di input.
  • Lo sviluppatore di pagine può personalizzare l'aspetto e il messaggio di errore di un controllo di convalida.
  • I controlli di convalida sono attivati da script ed eseguono la stessa verifica degli errori sia nei client (di livello superiore) che nel server.
  • Nei client di livello superiore, i controlli di convalida visualizzano errori di input senza un percorso andata/ritorno dal server. Gli errori di convalida per i singoli campi vengono visualizzati nel client non appena l'utente si sposta con la tabulazione su un campo diverso, mentre gli errori di convalida di campi obbligatori e un riepilogo degli errori vengono visualizzati quando l'utente invia il form.
  • Gli sviluppatori di pagine possono fornire uno script client che completa o sostituisce la verifica degli errori del lato client eseguita da un controllo di convalida.

La funzionalità di convalida comune è implementata dalla classe base astratta System.Web.UI.WebControls.BaseValidator, che implementa IValidator, registra gli script del lato con la pagina e fornisce una logica di base per il rendering. Le classi di convalida concrete, ad esempio RequiredFieldValidator, RegularExpressionValidator e CustomValidator, derivano da BaseValidator e aggiungono la relativa funzionalità specifica. Un riepilogo dei messaggi di errore di convalida viene fornito dal controllo ValidationSummary, il quale non è una convalida, poiché non implementa IValidator, e deriva da WebControl. ValidationSummary ha accesso all'insieme Validators di una pagina per ottenere il messaggio di errore di ciascuna convalida registrata con la pagina.

Se nel computer sono installati .NET Framework SDK o Visual Studio .NET, è possibile visualizzare la libreria di script generata da BaseValidator quando si esamina il file nella directory principale virtuale aspnet_client/system_web/<versione di SDK installata>. Per informazioni sulla generazione di script client, vedere Funzionalità client in un controllo server.

Qui di seguito vengono descritti i passaggi chiave per lo sviluppo di un controllo di convalida che fornisce la funzionalità di convalida di base. Seguire tali passaggi, se si desidera sviluppare un controllo di convalida di base per una libreria di convalida personalizzata o un controllo di convalida personalizzato in grado di fornire tutte le funzionalità di convalida necessarie. Se si è interessati a uno scenario più semplice, ad esempio l'estensione di una convalida esistente, non è necessario implementare questi passaggi. In questo caso, vedere gli esempi che estendono una convalida di base in Esempi di controllo di convalida.

Per implementare una convalida

Nota   I passaggi da 1 a 4 dell'elenco seguente sono comuni a tutte le convalide, comprese le classi di convalida del server che non sono controlli. I passaggi da 5 a 10 sono per i controlli che offrono un'interfaccia utente e generano script client.

  1. Definire una classe che implementi IValidator. Se la convalida è un controllo, è necessario che derivi direttamente o indirettamente da Control. I controlli di convalida in .NET Framework derivano da System.Web.UI.WebControls.Label, come mostrato nell'esempio seguente.

    public abstract class BaseDomValidator : Label, IValidator {...}
    [Visual Basic]
    MustInherit Public Class BaseDomValidator
       Inherits Label
       Implements IValidator
       ... 
    End Class
    

    Nota   A meno che non sia intesa come classe base, non è necessario che la convalida sia astratta.

  2. Implementare il contratto di IValidator. Nell'esempio seguente vengono illustrate le modalità di implementazione di IValidator. Vedere anche Esempio di controllo di convalida base.

    public string ErrorMessage {
                get {
                    object o = ViewState["ErrorMessage"];
                    return((o == null) ? String.Empty : (string)o);
                }
                set {
                    ViewState["ErrorMessage"] = value;
                }
            }
    public bool IsValid {
                get {
                    return isValid;
                }
                set {
                    isValid = value;
                }
            }
    public void Validate() {
    ...
    // A base validator cannot supply all the validating logic.
    // You can implement common functionality here and invoke an 
    // abstract method that is overridden by derived classes to
    // provide validation logic.
                IsValid = EvaluateIsValid();
            }
    
    // This method is overridden by a concrete class that extends 
    // the base validator to supply specific validation logic.
    protected abstract bool EvaluateIsValid();    
    [Visual Basic]
    Public Property ErrorMessage() As String Implements IValidator.ErrorMessage
       Get
          Dim o As Object = ViewState("ErrorMessage")
          If o Is Nothing Then
             Return String.Empty
          Else
             Return CStr(o)
          End If
       End Get
       Set
          ViewState("ErrorMessage") = value
       End Set
    End Property
    
    Public Property IsValid() As Boolean Implements IValidator.IsValid
       Get
          Return _isValid
       End Get
       Set
          _isValid = value
       End Set
    End Property
    
    Public Sub Validate() Implements IValidator.Validate
       ...
       ' A base validator cannot supply all the validating logic.
       ' You can implement common functionality here and invoke an 
       ' abstract method that is overridden by derived classes to
       ' provide validation logic.
       IsValid = EvaluateIsValid()
    End Sub
    
    ' This method is overridden by a concrete class that extends 
    ' the base validator to supply specific validation logic.
    Protected MustOverride Function EvaluateIsValid() As Boolean
    
  3. Aggiungere la convalida alla proprietà Validators della pagina contenitore quando quest'ultima viene inizializzata, eseguendo l'override del metodo OnInit nel modo seguente:

    protected override void OnInit(EventArgs e) {
                base.OnInit(e);
                Page.Validators.Add(this);
            }    
    [Visual Basic]
    Protected Overrides Sub OnInit(e As EventArgs)
       MyBase.OnInit(e)
       Page.Validators.Add(Me)
    End Sub    
    

    Nota   Se la convalida non è un controllo, questo passaggio deve essere eseguito dallo sviluppatore di pagine nel metodo Page_Load.

  4. Rimuovere la convalida dalla proprietà Validators della relativa pagina contenitore durante lo scaricamento della pagina eseguendo l'override del metodo OnUnload nel modo seguente:

    protected override void OnUnload(EventArgs e) {
                if (Page != null) {
                    Page.Validators.Remove(this);
                }
                base.OnUnload(e);
            }    
    [Visual Basic]
    Protected Overrides Sub OnUnload(e As EventArgs)
       If Not (Page Is Nothing) Then
          Page.Validators.Remove(Me)
       End If
       MyBase.OnUnload(e)
    End Sub    
    

    Nota   Se la convalida non è un controllo, questo passaggio deve essere eseguito dallo sviluppatore di pagine nel metodo Page_Unload.

  5. Definire una proprietà che consenta all'utente di associare un controllo di input da convalidare con la convalida. Nei controlli di convalida ASP.NET questa proprietà è denominata ControlToValidate e viene definita nel modo illustrato in Esempio di controllo di convalida base.

  6. Definire una proprietà che consenta all'utente di scegliere se il controllo deve generare script client. Nei controlli di convalida ASP.NET questa proprietà è denominata EnableClientScript; essa è definita come illustrato in Esempio di controllo di convalida base.

  7. Preparare la libreria di script client da associare al controllo di convalida e inserirla nella directory corretta del server in modo che possa essere utilizzata da altre applicazioni e non crei conflitti di versione. Per ulteriori informazioni, vedere la descrizione riportata in Funzionalità client in un controllo server. Per un esempio di libreria di script, vedere Esempio di libreria di script per la convalida.

  8. Richiamare i metodi di Page che generano script client. Per ulteriori informazioni, vedere la descrizione riportata in Funzionalità client in un controllo server e l'implementazione contenuta in Esempio di controllo di convalida base. Questi metodi per la creazione di script sono richiamati dai metodi PreRender e Render.

  9. Implementare la logica di rendering eseguendo l'override dei metodi AddAttributestoRender e Render. Per un esempio, vedere l'implementazione contenuta in Esempio di controllo di convalida base.

Tutti i passaggi qui illustrati vengono implementati in Esempio di controllo di convalida base.

Vedere anche

Esempi di controllo di convalida | Funzionalità del lato client in un controllo server