Validazione Aspnet

Abbiamo finora visto come inserire i valori in un capo e come farli leggere tramite postback o callback, facciamo adesso un passo indietro e vi parliamo di Validator Control ossia che il valore che un’utenza potrebbe immettere nel campo non sia errato a priori, quindi per esempio stiamo parlando di un invio con un campo vuoto che pero’ è richiesto, oppure l’inserimento di una data sbagliata, tipo il 32 del mese e cosi’ via.. Ma prima guardiamo alcuni comandi server. Diciamo subito che per comandi server si intende quei comandi che alla loro esecuzione rimandano il loro completamento nel server

Validazione Aspnet

per esempio se abbiamo il comando server textbox abbiamo tre possiibli modi di utilizzo normale, password e multiline, provate infatte a inserire sulla pagina aspx di default il seguente codice e date invio

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="users._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>

<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<br />
<br />
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<br />
<br />
<br />
<asp:TextBox ID="TextBox2" runat="server" TextMode="Password"></asp:TextBox>
<br />
<br />
<asp:TextBox ID="TextBox3" runat="server" TextMode="MultiLine"></asp:TextBox>

</div>
</form>
</body>
</html>

 

Vediamo adesso un esempio con autopostback ossia facendo ritornare i valori che inseriamo da testiera alla stessa pagina web del server che li ha generati, vediamo un esempio con un bottone ed un esempio per spiegarci meglio

proviamo ad inserire nella default questo codice

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="users._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>

<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<br />
<br />
<asp:TextBox ID="TextBox1" runat="server" AutoPostBack="True" OnTextChanged="operazione1"></asp:TextBox>

<br />
<br />
<br />
<asp:Button ID="Button1" runat="server" OnClick="operazione2" 
Text="Button" />
<br />
<br />

</div>
</form>
</body>
</html>

e nella relativa pagina cs del default il seguente codice con le due operazioni 1 e 2 che si attiveranno al momento che il testo verra’ cambiato o che il bottone verra’ digitato

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace users
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{

}

protected void operazione2(object sender, EventArgs e)
{
Response.Write("Tasto dgitato");
}

protected void operazione1(object sender, EventArgs e)
{
Response.Write("testo cambiato");
}
}
}

ovviamente consigliamo di utilizzare il progetto e non inserire il codice in maniera cruda, come per semplicità abbiamo fatto noi in questo caso

Una possibile variante del tasto Button che abbiamo appena visto potrebbe essere ImageButton, che ha la differenza che invece di inserire un buttone nel visuale mette un’immagine specificata nella proprietà ImageUrl.

 

Altro controllo server molto interessante è il DropDownList che in pratica permette di introdurre un valore fra n possibile valori predefiniti.

la cui sintassi potrebbe per esempio essere la seguente

<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" OnSelectedIndexChanged="operazione4">
<asp:ListItem>quanti anni hai</asp:ListItem>
<asp:ListItem>albachiara</asp:ListItem>
<asp:ListItem>E..</asp:ListItem>
<asp:ListItem>Il mondo che vorrei</asp:ListItem>
</asp:DropDownList>

 

a questo punto potete sbizzarrirvi voi a mettere gli eventuali incastri

 

per completezza vi facciamo vedere una possibile implementazione del listbox che visualizza a video una serie di possibili valori

<asp:ListBox ID="ListBox1" runat="server">

<asp:ListItem>Oggetto 1 </asp:ListItem>

<asp:ListItem>Oggetto 2 </asp:ListItem>

<asp:ListItem>Oggetto 3 </asp:ListItem>

<asp:ListItem>Oggetto 4 </asp:ListItem>

</asp:ListBox>


con la possibilità di fare una sola scelta per volta , oppure piu' scelte nel seguente modo

<asp:ListBox ID="ListBox1" runat="server" >

<asp:ListItem>Oggetto 1 </asp:ListItem>

<asp:ListItem>Oggetto 2 </asp:ListItem>

<asp:ListItem>Oggetto 3 </asp:ListItem>

<asp:ListItem>Oggetto 4 </asp:ListItem>

</asp:ListBox>

 

allo stesso modo funzionano anche gli altri comandi server control che trovate nella lista standard del visual web developer a voi .

 

 

Validazione Dati Controllo Server Aspnet

Validazione Aspnet

 

Vediamo adesso come funziona la Validazione dei dati, ossia il controllo di quello che inseriamo nella casella di testo dei nostri comandi server web. Faremo pochi ma significativi esempi. Iniziamo subito con la tabella che mostra quali sono i comandi a nostra disposizione.

 

Controllo Server
Descrizione Controllo
RequiredFieldValidator
garantisce che l’utente non abbia saltato un campo di input del form
CompareValidator
Pemette di confronare l’input dell’utlente con un ‘altra voce , utilizzando un operatore di confornto (uguaglianza, maggiore di , minore di, e cosi’ via)
RangeValidator
Verifica l’input dell’utente in funzione di un intervallo di numeri o caratteri definito da un limite inferiore e superiore
RegularExpressionValidator
Verifica che il dato dell’utente corrisponda a un patter definito da un’espressione regolare
CustomValidator
Verifica che il dato dell’utente utilizzi una logica di convalida personalizzata
ValidationSummary
Visualizza i messaggi di errore di convalida in una zona particolare della pagina

 

cominciamo subito con un esempio chiarificatore, introduciamo una pagina di default aspx e introduciamo il seguente codice

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="uservalidation._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>

<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<br />
<br />
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" 
ErrorMessage="RequiredFieldValidator" ControlToValidate="TextBox1" InitialValue="Valore iniziale campo opzionale" ></asp:RequiredFieldValidator>

<br />
<br />
<br />
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="funzione1" />
<br />
<br />
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<br />

</div>
</form>
</body>
</html>

 

Come sempre vi consigliamo di farlo tramite la pagina progettazione del visual web developer al fine dopo avere trascinato i vari comandi , dovrete ottenere questa pagina di programmazione.

E il relativo cs che intercetta gli eventi diventa

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace uservalidation
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{

}

protected void funzione1(object sender, EventArgs e)
{
if (Page.IsValid) {
Label1.Text = "la pagina è valida";
}
}
}
}

 

come potete vedere il controllo RequiredFieldValidaotor è associato al controllo del Textbox, al resto ci pensa il button che controlla tramite Page.IsValid se il campo di testo ha subito un cambiamento in quel caso da l’ok.

Analogamente si puo’ costruire uno script ad ok per verificare se in un dropdownlist il valore iniziale è stato modificato o meno in questo caso avremo

<asp:DropDownList ID="DropDownList1" runat="server">
<asp:ListItem>Seleziona una professione</asp:ListItem>
<asp:ListItem>Programmatore</asp:ListItem>
<asp:ListItem>Commercialista</asp:ListItem>
<asp:ListItem>Artista</asp:ListItem>
</asp:DropDownList>
<br />
<br />
<asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" 
ErrorMessage="RequiredFieldValidator" ControlToValidate="DropDownList1" InitialValue="Seleziona una professione"></asp:RequiredFieldValidator>
<br />

</div>

Come potete vedere il comportamento è nei due casi abbastanza analogo.

Passaimo adesso ad osservare il controllo di un altro Controllo Validator che si chiama CompareValidator, questo controllo permette di confrontare due elementi del form al fin e di stabilire se sono uguali, per esempio potrebbe essere il caso di quando vogliamo confrontare due password per chiederne una di conferma , in questo caso potrebbe essere il controllo ideale che fa al nostro caso. Vediamo subito un esempio.

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="compare._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>

<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<br />
<br />
<br />
<asp:CompareValidator ID="CompareValidator1" runat="server" 
ErrorMessage="CompareValidator" ControlToValidate="Textbox2" ControlToCompare="TextBox1"></asp:CompareValidator>
<br />
<br />
<br />
<br />

</div>
<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
<br />
<br />
<br />
<asp:Button ID="Button1" runat="server" Text="Button" Onclick="funzione1" />
<br />
<br />
<br />
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
</form>
</body>
</html>


e il relativo campo c sharp che intercetta il relativo codice e quindi abbiamo che:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace compare
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{

}

protected void funzione1(object sender, EventArgs e)
{
if (Page.IsValid) {
Label1.Text = "Password coincidenti"; 
}
}
}
}

Vediamo adesso il controllo RangeValidator che è per sua natura molto simile al controllo Compare Validator, ma in questo caso si verifica che il valore o la selezione indicata dall’utente sia compresa in un intervallo specificato, in modo che risulti maggiore o minore di una determinata costante

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="range._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>

<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<br />
<br />
<asp:RangeValidator ID="RangeValidator1" runat="server" 
ErrorMessage="RangeValidator" ControlToValidate="TextBox1" Type="Integer" Text="inserire valori compresi solo fra 30 e 40" MaximumValue="40" MinimumValue="30"></asp:RangeValidator>

</div>
</form>
</body>
</html>

come potete vedere il codice è abbastanza intuitivo e di facile comprensione, controlliamo adesso per esempio come sia possibile verificare l’esattezza di una email, ossia che sia in formato regolare utilizzando il controllo server RegularExpressionValidator. In pratica questo controllo permette di verificare l’input dell’utente rispoetto a un pattern da definire utilizzando un’espressione regolare.Vediamo una sua possibile implentazione

 

<asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" 
ErrorMessage="RegularExpressionValidator" Text="devi inserire un indirizzo di posta che sia valido"
ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"></asp:RegularExpressionValidator>

Dove la ValidationExpress è ottenuta impostando la giusta opzione nel campo dalla progettazione di visual web developer

Spesso e volentieri quando si programma si ha a che fare con pagine dove si deve immettere piu’ dati nei form, per esempio un ’email , una password , un username, insomma il sistema si troverebbe nell’imbarazzo di dovere gestire questo sistema con la reale possibilità di avere degli errori, tipo inseriamo un’email ma controlliamo il campo della password e cosi’ via, per ovviare a questo tipo di problemi, Aspnet 3.5 ha introdotto una nuova metodologia che si chiama ValidationGroup ossia ad ogni controllo server viene specificato a che gruppo appartiene in modo tale che non possa essere associato ad un altro gruppo che appuno cosi’ a un altro nome. Vediamo

 

<asp:RangeValidator ID="RangeValidator1" runat="server" 
ErrorMessage="RangeValidator" ValidationGroup="gruppo1" ControlToValidate="TextBox1" Type="Integer" Text="inserire valori compresi solo fra 30 e 40" MaximumValue="40" MinimumValue="30"></asp:RangeValidator>

<br />
<br />
<asp:Button ID="Button1" runat="server" Text="Button" ValidationGroup="gruppo1"/>
<br />

Analogamene se volessimo mettere un altro gruppo di controllo nella pagina dovremmo mettere un altro validation group e a questo punto le varie gerarchie sono rispettate.