Sunteți pe pagina 1din 7

Validarea datelor pe formularele Web

Nu există evenimentele Validating / Validated ca la aplicaţiile Windows Forms. Apoi,


nu toate evenimentele notifică imediat serverul despre producerea lor, pentru a nu încărca excesiv
traficul client – sever, spre exemplu, TextChanged, generat la orice modificare într-un textBox, nu
anunţă serverul despre modificarea textului, în pagina clientului; dacă dorim totuşi să executăm
imediat funcţia de tratare a unui astfel de eveniment trebuie să setăm proprietatea AutoPostBack a
controlului ce-l generează, pe valoarea true.
O altă particularitate a validării pe formularele Web constă în faptul că se poate face:
 pe server, adică la distanţă de locul care a generat evenimentul prin care se solicită
validarea; avem însă avantajul folosirii oricărui limbaj pentru care a fost instalat un
compilator pe server; în cazul.NET se poate folosi orice limbaj care a aderat la această
platformă;
 la client, în browser, cu dezavantajul folosirii doar a limbajelor recunoscute de
majoritatea browser-elor (pentru că nu ştim aprioric pe ce browser se va rula aplicaţia
noastră), adică Java Script sau Visual Basic Script.
Dacă e vorba de validare încrucişată e bine ca ea să se execute pe server; pentru validări
simple este mult mai eficient ca ele să se execute în browser, la client. Probleme de securitate !!
IE 4.0 şi versiunile următoare suportă DHTML şi se pot genera scripturi Java ce se execută
în browser şi care pot efectua validări.
Cele mai frecvente controale de validare disponibile pentru aplicaţiile ASP.NET şi dragabile
din ToolBox pentru web forms sunt:
 RequiredFieldValidator - pentru a indica obligativitatea introducerii unui câmp
( text în textBox, selecţie obligatorie în controale de selecţie etc.).
 RangeValidator – test de apartenenţă la un interval numeric, alfabetic, date
calendaristice; poate fi specificat static la momentul realizării aplicaţiei, sau dinamic, la
momentul execuţiei ( spre exemplu ca valoare introdusă într-un textBox).
 CompareValidator - test de egalitate cu o constantă sau cu o valoare cunoscută abia la
momentul execuţiei.
 RegularExpressionValidator – test de format standard ( de exemplu formatul
internaţional al unui număr de telefon, număr de card de credit cu checksum intern, adresă de
email, parole, cont bancar IBAN, etc.).
 CustomValidator – test specificat printr-un algoritm furnizat de programator.

Exemplu (aplicaţia webValidari)

1. Se trage un RequiredFieldValidator din ToolBox;


 i se pune proprietate Text pe valoarea "Trebuie introdus obligatoriu un nume";
 pentru proprietatea ControlToValidate se alege din comboBoxul disponibil id-ul unui
control textBox tbNumele, existent deja pe formă;
 proprietatea Display (Static, Dinamic, None) precizează dacă mesajul de eroare are un
loc rezervat permanent în pagina Web, doar la producere, sau deloc.
2. Se trage din ToolBox un RangeValidator şi i se stabilesc proprietăţile:
 Text: 1 < varsta < 100
 MaxVal = 100, minVal = 1
 ControlToValidate punctează controlul tbVarsta, selectat din lista afişată;
 EnableClientScript: true – validarea se face la client; false - validarea se face pe
server.
 Enabled – cu true / false pentru a activa / inhiba uşor validările introduse prin acest
control;

1 24.03.2019
 ErrorMessage – textul explicit al mesajului afişat în ValidationSummary, în cazul
unei erori de validare;
 Text - mesaj afişat de control în situaţia invalidării.
 Type – tipul datei de validat; informaţia e convertită la acest tip înainte de validare.
Dacă în câmp nu se introduce nimic, se consideră situaţie validă; dacă se doreşte altfel, se va
adăuga şi un control RequiredFieldValidator,ţintind spre acelaşi câmp. Dacă eşuează
conversia la tipul indicat, se consideră de asemenea situaţie validă.

Ca să fixăm momentul validării am folosit un buton Save, care implicit anunţă serverul când
este apăsat cu mouse-ul şi care în realitate afişează într-un textBox numele preluat din tbNumele.
private void btnSave_Click(object sender, System.EventArgs e)
{
tbAfisaj.Text+="\r\n"+tbNumele.Text;
}

Un control poate fi ţinta mai multor controale de validare, implementând astfel criterii
diferite de validare; practic i se asociază câte un control de validare pentru fiecare tip de eroare
controlată.

ValidationSummary

Permite afişarea centralizată a tuturor erorilor de validare ( textul precizat în proprietatea


ErrorMessage a diferitelor controale de validare), în locul celor afişate de controalele de validare
individuale.
1. Se trage un control ValidationSummary din ToolBox şi i se stabilesc proprietăţile:
 Enabled = true
 ShowMessageBox = false (nu afişează şi un MessageBox cu mesaje, în afara
mesajului din centralizator).
 ShowSummary = true, dacă se doreşte ca mesajul de eroare să se afişeze şi în corpul
documentului HTML.
 DisplayMode, forma de afişare a mesajelor, prin alegere din enumerarea
BulletList, List, SingleParagraph;
2. Proprietatea Text pentru controalele individuale de validare se pune pe "*", iar în
proprietatea ErrorMessage se trece textul de afişat în clar, astfel încât în dreapta
controlului ce prezintă eroarea se afişează doar un asterisc, iar mesajul de eroare se
afişează în centralizator. Dacă ShowMessageBox este false afişarea mesajelor de eroare se
va face doar în ValidationSummary, nu şi într-un MessageBox separat.

CustomValidator

2 24.03.2019
Pentru validări particulare, specifice fiecărui program, se poate folosi controlul CustomValidator;
el deţine:
 o proprietate, ClientValidationFunction, care precizează metoda de validare
aplicată în browser-ul clientului;
 un eveniment, ServerValidate, care poate fi tratat printr-o funcţie executată pe
server.
Deoarece validarea se execută la client s-au pe server depinzând şi de capacităţile
browserului, se recomandă furnizarea ambelor funcţii de validare. Aşa cum aminteam, în timp ce
funcţia de validare pe server este scrisă în orice limbaj acceptat sub .NET, funcţia de validare la
client este scrisă, pentru a fi acceptată de majoritatea browserelor, în JavaScript sau VBScript.

Exemplu (aplicaţia CustomValidator )

Vom exemplifica lucru cu acest control considerând că ataşăm unui textBox tbNumar un
CustomValidator care semnalează eroare la introducerea unui număr impar.

1. Se crează o aplicaţie WebForm conţinând, printre altele, un textbox tbNumar şi un buton


btnTrimite;
2. Se aduce un control CustomValidator din ToolBox şi i se stabilesc proprietăţile:
 ControlToValidate: tbNumar
 ErrorMessage: Eroare de paritate
 ClientValidationFunction: ValidarePeClient
3. Cu CustomValidator1 selectat, în Properties / Events se stabileşte funcţia de tratare
pentru ServerValidate: ValidarePeServer, având conţinutul:

private void ValidarePeServer(object source,


System.Web.UI.WebControls.ServerValidateEventArgs args)
{
tbMesaje.Text="\r\n Validare pe sever cu "+args.Value.ToString()+ " si ";
try
{
int nrPar = Int32.Parse(args.Value);
if (nrPar % 2 == 0)
args.IsValid = true;
else args.IsValid = false;
}
catch (Exception)
{
Response.Write("<br><br>Introduceti doar numere pare.<br>");
}
}
Funcţia primeşte ca parametri un obiect ce deţine proprietatea IsValid (pagina, în cazul
nostru ) şi un bloc de argumente specifice evenimentului ServerValidate; acest bloc conţine
printre altele şi valoarea supusă validării args.Value. Funcţia încearcă o conversie a intrării din
tbNumăr în număr, considerând ca intrări valide doar numerele întregi pare.

4. La nivelul codului HTML al paginii se inserează ( înainte de terminarea descrierii formei


</form> ) şi scriptul aferent funcţiei Java, de validare la nivel de browser:

<script language="javascript">
function ValidarePeClient(source, args)
{
// document.write( "<tr><td> ValidarePeClient </td><td>" );
// document.write(args.Value.toString());
if (args.Value % 2 == 0)
args.IsValid=true;
else
args.IsValid = false;

3 24.03.2019
}
</script>

5. Cu CustomValidator1 selectat, în Properties se stabileşte că scriptul de mai sus conţine


funcţia de tratare la nivel de browser, adică proprietatea ClientValidationFunction:
ValidarePeClient.

6. Pe un buton btnTrimite se forţează prin trimiterea paginii, cererea de validare:

private void btnTrimite_Click(object sender, System.EventArgs e)


{
if (Page.IsValid)
tbMesaje.Text+="\n"+tbNumar.Text + ": Input valid.";
else
tbMesaje.Text+="\r\n"+tbNumar.Text + ": Input invalid.";
}
În plus, într-o casetă de mesaje se afişează pentru o confirmare suplimentară, prezenţa erorii
de validare la nivel de pagină.

7. Punând pe rând pentru CustomValidator1 proprietatea EnableClientScript pe true,


respectiv false, constatăm efectul celor două tipuri de validări.
Funcţia ValidarePeClient nu are return şi se execută cu prioritate ( înainte de a se trimite
pagina în server); dacă detaşăm handler-ul ValidarePeServer atunci se afişează doar ce se
stabileşte în funcţie de validarea din client (mesajul scurt, fără menţiunea de validare pe server).

Dacă lăsăm nedetaşat handler-ul ValidarePeServer atunci se execută ambele validări,


astfel încât se va afişa validitatea constatată de funcţia din server.

RegularExpressionValidator

Funcţionează după modelul controalelor de validare de mai sus, având în plus proprietatea
ValidationExpression prin care se indică expresia uzuală ce stă la baza validării:

ValidationExpression = "[0-9]{8}|[0-9]{5}-[0-9]{3}"
8 cifre sau 5 + 3 cifre separate cu liniuţă ;
ValidationExpression = "^\d{5}$" cu semnificaţia:
 ^ început de şir
 \d digit
 {5} exact cinci cifre

4 24.03.2019
 $ sfârşit de şir

[a-zA-Z] – conţine doar caractere alfabetice


[a-zA-Z0-9\.\_]+@[ a-zA-Z.]+\.[ a-zA-Z]{3} – pentru a descrie formatul unei adrese de
email.

De un real folos în validarea datelor sunt aşanumitele expresii regulate; ele sunt nişte
şabloane abstracte folosite pentru a preciza structura pe care trebuie să o respecte un câmp pentru a
fi considerat valid.
Sub Visual Studio, namespace-ul System.Text.RegularExpressions conţine clasa
specializată al cărei constructor de clasă, Regex. Regex(pattern, options), primeşte un model de
expresie regulată şi opţiuni (un singur caracter; "i" – insensitive matching; ). Clasa mai conţine:
 IsMatch – metodă statică şi nestatică, pentru căutarea unui pattern într-un şir, returnând true
sau false. Varianta nestatică cere doar şirul în care caută, deoarece modelul de căutare s-a dat
în constructor.
 Metoda Matches returnează toate subşirurile în care se găseşte pattern-ul de căutare, sub
forma unei colecţii MatchCollection ce conţine obiecte de tip Match, colecţie care poate apoi
fi apoi iterată cu foreach.
 Metoda nestatică Replace a clasei Regex primeşte doi parametri, şirul în care caută pattern-ul şi
un şir cu care va substitui orice apariţie a pattern-ului în sir. De remarcat generalitatea căutării,
în sensul că în constructorul expresiei regulate se pot da pattern-uri complexe, de genul "ceva\b"
care semnalează şi substituie "ceva" doar când apare ca margine de cuvânt (\b - boundary).
 Lucrurile stau similar şi cu metoda Split a clasei Regex, care se aseamănă cu metoda Split a
clasei String, dar oferă în plus facilităţi incomparabil mai puternice de calificare a subşirului pe
baza căruia se va face splitarea şirului într-un vector de subşiruri.

\ Marchează caracterul următor drept secvenţă de escape sau un caracter special,


literal sau back-reference. De exemplu, '\n' indică newline; '\\' indică "\" ca proprie
secvenţă de escape.
^ Inceput de string; pentru un obiect Multiline, ^ indică prima poziţie după '\n' sau '\r'
(început de rând).
$ Sfârşit de string; pentru un obiect Multiline, $ marchează poziţia ce precede '\n' or
'\r' ( sfârşit de rând).
* Poziţie identică cu precedenta, sau subexpresie lipsă sau prezentă de mai multe ori.
Spre exemplu, zo* permite "z" sau "zoo". * este echivalent cu {0,}.
+ Poziţie identică cu precedenta sau o subexpresie ce se produce o dată sau de mai
multe ori. Spre exemplu, 'zo+' permite "zo" şi "zoo", nu şi "z". + este echivalent cu
{1,}.
? Poziţie identică cu precedenta sau o subexpresie ce se produce de zero ori sau o
dată. Spre exemplu, "do(es)?" indică "do" sau "does". ? este echivalent cu {0,1}
{n} n întreg nenegativ, pentru o poziţie ce se repetă de exact n ori. Spre exemplu, 'o{2}'
nu permite 'o' în "Bob,", dar poate desemna cei doi de 'o' din "food".
{n,} n întreg nenegativ, pentru o poziţie ce se repetă de cel puţin n ori. Spre exemplu,
'o{2,}' nu permite "o" în "Bob", dar permite mai mulţi de 'o' ca în "foooood". 'o{1,}'
este echivalent cu 'o+' , iar 'o{0,}' este echivalent cu 'o*'.
{n,m} m şi n doi întregi nenegativi, cu n <= m, desemnează cel puţin n şi cel mult m
apariţii. Spre exemplu, "o{1,3}" permite descrierea doar a primilor trei de 'o' în
"fooooood". 'o{0,1}' este echivalent cu 'o?'. De reţinut că nu se pune spaţiu între
virgulă şi numere.
? Când urmeză altor caractere cuantificatori, (*, +, ?, {n}, {n,}, {n,m}), pattern-ul
devine non-greedy. Un pattern non-greedy indică cel mai puţin posibil din şirul

5 24.03.2019
căutat, în timp ce un pattern greedy permite cel mai mut posibil dintr-un şir căutat.
Spre exemplu, în şirul "oooo", 'o+?' indică un singur "o", în timp ce 'o+' îi indică pe
toţi.
. Un singur caracter, oarecare, exceptând "\n". Pentru a desemna un caracter oarecare,
inclusiv "\n"se foloseşte pattern-ul '[\s\S]'.
(pattern) Desemnează pattern şi captează rezultatul. Rezultatul potrivirii poate fi regăsit din
colecţia Matches, folosind SubMatches în VBScript sau $0…$9 în JScript. Pentru
descrierea parantezelor ( ), se folosesc secvenţele de escape '\(' şi '\)'.
(?:pattern) Ca mai sus, dar nu reţine rezultatul potrivirii, pentru o folosire ulterioară. Este util
pentru a combina părţi dintr-un pattern cu operatori "or" ( | ). Spre exemplu,
'industr(?:y|ies) este o descriere prescurtată a expresiei 'industry|industries'.
(?=pattern) Anticiparea pozitivă indică o potrivire dacă pattern-ul începe oriunde în şirul căutat.
Este un test fără reţinerea rezultatului. Spre exemplu, 'Windows (?=95|98|NT|2000)'
acoperă "Windows" în "Windows 2000", dar nu şi "Windows" din "Windows 3.1".
Anticiparea pozitivă nu consumă caractere; deci, căutarea pentru următoarea
potrivire începe imediat după ultimul caracter potrivit, nu după toate caracterele
cuprinse în anticipare.
(?!pattern) Anticiparea negativă indică o potrivire dacă şirul căutat începe oriunde apare ceva
diferit de pattern. Este un test fără reţinerea rezultatului. Spre exemplu, 'Windows
(?!95|98|NT|2000)' acoperă "Windows" din "Windows 3.1", dar nu acceptă
"Windows" din "Windows 2000". Anticiparea nu consumă caractere; deci, căutarea
pentru următoarea potrivire începe imediat după ultimul caracter potrivit, nu după
toate caracterele cuprinse în anticipare.
x|y x sau y. Spre exemplu, 'z|food' acoperă "z" sau "food", în timp ce '(z|f)ood' descrie
"zood" sau "food".
[xyz] Mulţime de caractere, formată din oricare din caracterele date între cele două
paranteze închise. Spre exemplu, '[abc]' poate acoperi pe 'a' din "plain".
[^xyz] Mulţime complementară de caractere, formată din oricare din caracterele care nu
apar între cele două paranteze închise. Spre exemplu, '[abc]' poate acoperi pe 'p' din
"plain".
[a-z] Interval de caractere. Spre exemplu, '[a-z]' desemnează literele mici din alfabet,
cuprinse între 'a' şi 'z' , iar [3–7a–dA–D] , cifre între 3-7 sau litere mici sau mari
între a-d.
[^a-z] Complementul unui interval de caractere, cuprinzând orice caracter ce nu face parte
din intervalul specificat. Spre exemplu, '[^a-z]' precizează orice caracter necuprins
între 'a' şi 'z'.
\b Margine de cuvânt, adică o poziţie între cuvânt şi spaţiu. Spre exemplu, 'er\b'
identifică 'er' în "never", dar nu şi 'er' în "verb".
\B Ne-margine de cuvânt. 'er\B' identifică pe 'er' în "verb", dar nu şi pe 'er' în "pioner".
\cx Caracter de control asociat cu x. Spre exemplu, \cM indică Control-M sau carriage
return. Valorile lui x trebuie să fie cuprinse în intervalul A-Z sau a-z; altminteri,
construcţia e tratată ca literal pentru caracterul 'c'.
\d Digit, cifră din intervalul 0-9; echivalent cu [0-9].
\D Nondigit, caracter din afara intervalului 0-9; echivalent cu [^0-9].
\f Caracterul form-feed; echivalent cu \x0c sau \cL.
\n Caracterul newline; echivalent cu \x0a sau \cJ.
\r Caracterul carriage return; echivalent cu \x0d sau \cM.
\s Caracter spaţiu (whitespace), incluzînd space, tab, form-feed, tab vertical, new line,
cariage return; echivalent cu [ \f\n\r\t\v].
\S Caracter non-whitespace; echivalent cu [^ \f\n\r\t\v].
\t Caracterul tab orizontal, adică \x09 sau \cI.

6 24.03.2019
\v Caracterul tab vertical, adică \x0b sau \cK.
\w Caracter de tip "word", litere, cifre şi underscore; echivalent cu [A-Za-z0-9_].
\W Caracter "nonword", adică echivalentul lui [^A-Za-z0-9_].
\xn Hexa-digit; n este o valoare hexadecimală dată ca secvenţă de escape, din două
cifre. Spre exemplu, '\x41' indică pe "A". '\x041' deoarece excede două cifre va fi
tratat ca '\x04' & "1". Permite folosirea codurilor ASCII în expresii regulate.
\num Identifică un număr num, întreg pozitiv, pentru o referinţă înapoi capturată anterior.
Spre exemplu, '(.)\1' desemnează două caractere consecutive, identice.
\n Identifică o secvenţă octală de escape sau o referinţă înapoi. Dacă \n este precedat
de cel puţin n subexpresii capturate, \n este tratată ca backreference. Altminteri, \n
este tratată ca secvenţă octală de escape, dacă n aparţine intervalului 0-7.
\nm Identifică o secvenţă octală de escape sau o referinţă înapoi. Dacă \nm este precedat
de cel puţin nm subexpresii capturate, \nm este tratată ca backreference. Dacă \nm
este precedat de cel puţin n subexpresii capturate, \nm este tratată ca backreference
urmată de un literal. Dacă niciuna din condiţiile de mai sus nu este îndeplinită, \nm
este tratată ca secvenţă octală de escape, cu condiţia ca m şi n să fie cifre octale (0-
7).
\nml Secvenţă de escape octală; n ia valori în 0-3, iar m şi l iau valori în 0-7.
\un Identifică pe n, un caracter Unicode exprimat prin patru cifre hexazecimale. Spre
exemplu, \u00A9 desemnează simbolul pentru copyright (©).

Numărul de prezenţe ale unui caracter sau clase de caractere se specifică printr-un
cuantificator; el se pune imediat după caracter sau clasa de caractere din şablon şi permite
specificarea numărului de produceri ale caracterului sau ansamblului de caractere, acceptat ca valid.

Cuantificator Interpretare

* Nicio sau mai multe potriviri

+ Una sau mai multe potriviri

? Nicio sau o potrivire

{N} N potriviri

{N,} N sau mai multe potriviri

{N,M} Între N şi M

Câteva exemple lămuresc cel mai bine lucrurile.

[aeiou]{2,4}\+[1–5]* precizează că se aşteaptă un şir care începe cu două până la patru vocale,
urmate de semnul + şi terminat cu nicio sau mai multe cifre cuprinse între 1 şi 5.

^[\w-_\.]+\@([\w]+\.)+\w+$ este un pattern pentru validarea adresei de email

7 24.03.2019

S-ar putea să vă placă și