Občas se nám může objevit potřeba, kdy potřebujeme formulář rozdělit na několik zón (ValidationGroup) a validaci v nich řídit samostatně, například podle toho, jako zónu si uživatel vybral radio-buttony.
ASP.NET bohužel ve verzi 1.1 nějaké podrobnější řízení validace nepodporuje, ve verzi 2.0 už dává alespoň validation groups (kterých využijeme), nicméně stále jejich použití váže na samostatnou inicializaci post-backu (pro každou validation group se předpokládá samostatné odesílací tlačítko).
Pokud potřebujeme formulář s jediným tlačítkem, který bude validovat na základě nějakého přepínače, který obsahuje (typicky na základě radio-buttonů nebo i drop-down-listu), pak nastávají potíže.
Validace na straně serveru
Pokud nám postačuje validace na straně serveru, je situace poměrně jednoduchá, protože využijeme metody Page.Validate(vaidationGroup) a následně ověřujeme už jenom Page.IsValid.
Validátory si rozdělíme na několik skupin
- ty, které chceme vyhodnocovat vždy, těm vlastnost ValidationGroup nenastavíme,
- ty, které chceme vyhodnocovat na základě přepínače, ty umístíme do příslušné skupiny ValidationGroup
Post-backovému tlačítku pak ValidationGroup nenastavíme, čímž dosáhneme toho, že i na klientu se nám budou vyhodnocovat alespoň ty společné validátory, které nemají nastaveno ValidationGroup.
V obsluze události na straně serveru pak postupujeme zhruba takto:
private void Tlacitko_Click(object sender, EventArgs e) { // validátory bez ValidationGroup jsou vyhodnoceny // stačí se tedy ptát Page.IsValid if (IsValid) { if (PrepinacJednaRB.Checked) { // radio-buttonový přepínač je nastaven na zónu 1 // vyvoláme si tedy vyhodnocení validátorů zóny 1 Validate("ValidationGroupJedna"); if (IsValid) { ... // obsluha zóny 1 } else { return; } } else if (PrepinacDvaRB.Checked) { // přepínač je nastaven na zónu 2 Validate("ValidationGroupDva"); if (IsValid) { ... // obsluha zóny 2 } else { return; } } // tady můžeme obsloužit controly společné pro všechny zóny // je splněna obecná validace i prošla validace zvolené zóny // takže třeba result.Save(); } }
Ještě je třeba doplnit, že i control ValidationSummary zobrazuje pouze hlášky příslúšné ValidationGroup, tedy bychom měly mít tolik ValidationSummary, kolik máme validation groups.
Validace na straně klienta
Požadujeme-li stejné chování validátorů už na straně klienta, je situace složitější. Musíme si totiž vytvořit klientský skript, který nejprve rozhodne na základě hodnot formuláře, která zóna je vybrána (který radio-button je zakliknut) a zavolá validace pro příslušné ValidationGroup.
Volání post-backu s příslušnou validací si vygenerujeme pomocí ClientScriptManager.GetPostBackEventReference(), kam přes PostBackOptions předámeValidationGroup. Horší to bude s vícenásobnou validací (např. společná + group), kde už si budeme muset pomoct nekonvenčními metodami a volat JScript ASP.NETu natvrdo.
Vzhledem k tomu, že v praxi pro takovéto klientské validace existují hotové a promyšlené validační controly třetích stran, nemá smysl se do této oblasti hlouběji potápět…
Připojuji také odkazy na několik článků, které popisují řízení validace na straně klienta: