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: