Tag Archives: validator

ASP.NET Validátory

Približne pred rokom som začal programovať v ASP.NET/C#, odvtedy som postupne objavoval ASP.NET framework a bol som maximálne spokojný s tým, ako je navrhnutý a ako dobre sa s ním dá pracovať.

Jednou z pekných feature ASP.NET sú validátory formulárov. Ku každej controle (TextBox, DropDownList, RadioButtonList, CheckBox ale aj ku custom controlom) sa dá pridať validátor, ktorý dokáže zvalidovať danú controlu. Existujú preddefinované validátory – hlavné sú:
* RequiredFieldValidator – controla musí mať definovanú neprázdnu hodnotu
* CompareValidator – hodnota controly musí byť zhodná s hodnotou inej controly (napr registračný formulár – heslo zvyčajne treba zadať 2x)
* RangeValidator – hodnota controly musí byť z určitého rozsahu
* RegularExpressionValidator – hodnota controly musí matchovat regulárny výraz
* CustomValidator – controla sa validuje vlastným kódom (zadefinovanom v nadradenej controle)

Všetky tieto validátory validujú dáta na strane servra, ale môžu validovať dáta už aj na strane klienta (zabránia odoslaniu formulára). Na každú controlu môže byť naviazaných viacero validátorov. Validátory môžu mať nastavenú aj tzv ValidationGroup a ErrorMessage. ValidationGroup sa používa v prípade, že potrebujeme validovať rôzne časti formulára. ErrorMessage sa zasa použije v prípade, že controle nezbehne validácia.Veľmi príjemná je aj controla ValidationSummary, ktora sa klientovi zobrazí pri neúspešnej validácii a sú v nej vypísané ErrorMessage všetkých validátorov, ktoré ohlásili pri validácii chybu.

Príklad: V registračnom formulári, využívajúcom validátory, je možné použiť takýto jednoduchý kád na zvalidovanie celeho formulara (a vypísanie chybových hlášok):

protected void registerUser()
{
Page.Validate("RegistrationForm");

if (Page.IsValid)
{
// tu mame istotu, ze su vsetky data validne
... // samotna registracia
}
}

ALE

Nedávno som potreboval na stránku umiestniť Captcha, siahol som teda po hotovom riešení – ReCaptcha. K tejto službe sú už priamo od poskytovateľov dostupné knižnice do ASP.NET, ktoré fungujú veľmi sympaticky – stačí includnut controlu, nastaviť jej private a public key (prípadne ďaľšie nepovinné nastavenia) a výsledok dostaneme v Page.IsValid, nakoľko sa controla sama zaregistruje medzi validátory na stránke.

Stránka, na ktorej som sa chystal toto riešenie použiť bola ale zložitá, potreboval som použiť ValidationGroup, ktorý controla nepodporovala. Rozhodol som sa ho teda do controly dopísať, čo si vyžadovalo štúdium útrob validácie v ASP.NET. Pri tom som zistil, že interface IValidator (ktoré ReCaptcha controla dedila) nemá zadefinovanú property ValidationGroup, ale túto má zadefinovanú až (a iba) trieda BaseValidator (ktorá nemusí byť vhodná na každé použitie – dedí po triede Label, čo je v mojom prípade neželané).

Z toho vyplýva, že je nemožné spraviť jednoduchú, elegantnú custom controlu, ktorá je sama sebe plnohodnotným validátorom. Situácia sa dá vyriešiť až zabalením controly spolu s CustomValidator-om do novej controly, ktorá bude mať vyvedené nastavenia ValidationGroup a ErrorMessage – na tomto riešení je nepekný fakt, źe kód validátora a samotnej controly je v rôznych controloch.