I controlli server di convalida di ASP.NET 2.0 permettono di effettuare in modo estremamente semplice la validazione lato client e lato server dei campi di un form.
Come impostazione predefinita viene effettuato anche il controllo lato client ma è sufficiente impostare la proprietà
EnableClientScript a
False per disabilitarlo.
La validazione lato client deve essere disabilitata se si desiderano utilizzare i controlli server di convalida all'interno di un controllo UpdatePanel fornito dalle ASP.NET AJAX Extesions.
I controlli server di convalida sono (escludendo il controllo ValidationSummary):
Nome del controllo |
Descrizione |
RequiredFiledValidator |
Garantisce che l'utente abbia impostato il campo |
CompareValidator |
Confronta l'input dell'utente con un'altro valore |
RangeValidator |
Controlla che l'input dell'utente sia compreso in un certo intervallo |
RegularExpressionValidator |
Controlla che l'input dell'utente soddisfa un pattern definito da una espressione regolare |
CustomValidator |
Controlla che l'input dell'utente soddisfa una logica personalizzata |
Di seguito mostro alcuni esempi di utilizzo abbastanza intuitivi per mostrare alcune delle proprietà meno note.
Garantire che una casella di testo non venga lasciata vuota:
<asp:TextBox ID="controllo" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server"
Text="Messaggio di errore visualizzato"
ErrorMessage="Messaggio di errore che sarà visualizzato in un ValidationSummary"
ControlToValidate="controllo"
SetFocusOnError="True" />
Garantire che una casella di testo non venga lasciata vuota e venga modificato il valore iniziale:
Per fare questo è necessario utilizzare due RequiredFieldValidator.
Una proprietà importante è InitialValue che permette di impostare il testo iniziale dell'elemento che l'utente deve modificare prima di effettuare il submit del form.
<asp:TextBox ID="controllo" runat="server">Inserisci nome</asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server"
ErrorMessage="Devi cambiare il valore al campo."
ControlToValidate="controllo"
Display="Dynamic"
InitialValue="Inserisci nome"/>
<asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server"
ErrorMessage="Non lasciare vuoto il campo."
Display="Dynamic"
ControlToValidate="controllo"/>
Garantire la scelta di una voce da una DropDownList:
<asp:DropDownList ID="Colori" runat="server">
<asp:ListItem Selected="True">Seleziona un colore</asp:ListItem>
<asp:ListItem>Rosso</asp:ListItem>
<asp:ListItem>Verde</asp:ListItem>
<asp:ListItem>Blu</asp:ListItem>
</asp:DropDownList>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server"
ErrorMessage="Devi selezionare un colore"
ControlToValidate="Colori"
Display="Dynamic"
InitialValue="Seleziona un colore"/>
Garantire che venga inserita una data in una casella di testo:
<asp:TextBox ID="data" runat="server"></asp:TextBox>
<asp:CompareValidator ID="CompareValidator1" runat="server"
ErrorMessage="Non hai inserito una data."
ControlToValidate="data"
Type="Date"
Operator="DataTypeCheck"/>
Garantire che venga inserito un numero tra 0 e 10:
<asp:TextBox ID="voto" runat="server"></asp:TextBox>
<asp:RangeValidator ID="RangeValidator1" runat="server"
ErrorMessage="Devi inserire un voto tra 0 e 10"
ControlToValidate="voto"
Type="Integer"
MinimumValue="0"
MaximumValue="10" />
Controllare che venga inserito un indirizzo di posta elettronica:
<asp:TextBox ID="mail" runat="server"></asp:TextBox>
<asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server"
ErrorMessage="Inserire un indirizzo di posta elettronica valido."
ControlToValidate="mail"
ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" />
Effettuare una convalida personalizzata sia sul client che sul server (valore numerico potenza di 10):
Per prima cosa è opportuno definire una funzione javascript che effettuerà la validazione:
<script language="javascript" type="text/javascript">
// Controllo che il testo inserito sia un numero multiplo di 10
function controlloClient(source, args)
{
var testo = args.Value; // Leggo il valore del controllo
if ( testo % 10 == 0 )
{
args.IsValid = true; // La validazione è andata a buon fine
return;
}
args.IsValid = false; // Il controllo non ha superato la validazione
}
</script>
Dopodichè si inserisce un controllo CustomValidator impostando la proprietà ClientValidationFunction con il nome della funzione javascript.
<asp:TextBox ID="potenzaDiDieci" runat="server"></asp:TextBox>
<asp:CustomValidator ID="CustomValidator1" runat="server"
ErrorMessage="Devi inserire una potenza di 10."
ControlToValidate="potenzaDiDieci"
ClientValidationFunction="controlloClient"
onservervalidate="CustomValidator1_ServerValidate" />
Per effettuare la convalida lato server invece è opportuno gestire l'evento
onservervalidate e procedere in modo analogo a quanto effettuato sul client.
// Gestore che effettua la validazione lato server del numero
protected void CustomValidator1_ServerValidate(object source, ServerValidateEventArgs args)
{
string testo = args.Value; // Leggo il valore del controllo da validare
int numero;
Int32.TryParse(testo, out numero);
if ( Int32.TryParse(testo, out numero) )
{
if (numero % 10 == 0)
{
args.IsValid = true;
}
else
{
args.IsValid = false;
}
}
else
{
args.IsValid = false;
}
}
E' da sottolineare ad esempio che all'interno del pulsante che ha provotato il PostBack è possibile utilizzare la proprietà IsValid dell'oggetto Page per controllare se il form ha superato la procedura di validazione.
protected void Button1_Click(object sender, EventArgs e)
{
if (Page.IsValid)
{
// TODO: Elaborazione del form...
}
}
Note aggiuntive:
- All'interno di ErrorMessage è possibile inserire del testo HTML, quindi è possibile anche inserire delle immagini che segnalino visivamente l'errore.
- Se si desiderano utilizzare più form all'interno di una pagina in ASP.NET 2.0 è possibile utilizzare la proprietà ValidationGroup per raggruppare i controlli di convalida in gruppi separati tra di loro.
- Nel caso sia impostato SetFocusOnError a true e si verificano più errori, il focus sarà dato al controllo del form più in alto nella pagina.