mozillaMedlem sedan juli 20011 202 inlägg
Jag håller på och testar lite med validation på min hemsida. Och jag skulle vilja ändra css-klass på alla TextBoxar som inte klarar valideringen. Men jag skulle helst vilja använda mig av de vanliga RequiredFieldValidator, RegularExpressionValidator osv. Men fånga upp de som inte är IsValid och ändra klassen på textboxen som den kontrollerar.
Jag har kommit en bit på väg, men nu vet jag inte riktigt hur jag ska fortsätta så jag frågar här. Jag har gjort en rekursive funktion som irriterar genom alla kontroller.
void IterateThroughChildren(Control parent) {
foreach(Control ctrl in parent.Controls) {
if(ctrl.GetType().ToString().Equals("System.Web.UI.WebControls.RequiredFieldValidator")) {
Control ctrlTextBox = FindControl(((RequiredFieldValidator)ctrl).ControlToValidate);
if(!((RequiredFieldValidator)ctrl).IsValid)
((TextBox)ctrlTextBox).CssClass = "error";
else
((TextBox)ctrlTextBox).CssClass = "";
}
if(ctrl.Controls.Count > 0) { IterateThroughChildren(ctrl); }
}
}
Jag har egentligen två frågor. Dels går det att lösa på något annat sätt? önskvärt vore om det fanns en funktion/anrop för varje kontroll som är fel. Men jag har inte lyckats hitta något i mitt googlande.
Min andra fråga gäller min nuvarande kod, som fungerar ganska bra. Problemet är att den bara funkar på just RequiredFieldValidator. Detta eftersom jag måste ange av vilken typ Controllen är för att kunna hämta "ControlToValidate" och "IsValid". Men finns det något sätt att dynamisk ändra typen. Så jag slipper göra 3-4 if-satser för varje enskild Validator?
BrimbaMedlem sedan dec. 19992 966 inlägg
Du kan bygga en egen TextBox som gör det du vill.
Jag hittade en som redan har gjort ungefär det du vill, som du kan utgå från iaf.
http://www.codeproject.com/aspnet/selfvalidatingtextbox.asp
emissionMedlem sedan dec. 19996 095 inlägg
Det borde gå att lösa genom att ärva dessa kontroller och utöka deras funktionalitet. Beträffande fråga två:
void IterateThroughChildren(Control parent)
{
foreach(Control ctrl in parent.Controls) {
BaseValidator validator=ctrl as BaseValidator;
if(validator!=null)
{
TextBox ctrlTextBox = FindControl(validator.ControlToValidate) as TextBox;
if (ctrlTextBox!=null)
{
ctrlTextBox.CssClass = (validator.IsValid) ? "" : "error";
}
}
if(ctrl.Controls.Count > 0) { IterateThroughChildren(ctrl); }
}
}
Förövrigt har Page-klassen en färdig collection med validatorerna, som är smidigare att loopa över.
mozillaMedlem sedan juli 20011 202 inlägg
Tack för era tips, i framtiden blir det nog till att göra en helt egen lösning. Men nu valde jag att göra som du föreslog att hämta Page.Validators och loopa igenom dem. Det uppstod dock ett nytt problem genom att en textbox kan ha flera validatorer på sig. Och en RegularExpressionValidation ger ju ifrån sig IsValid om rutan är tom. Och skriver på så sätt över RequiredFieldValidatorn. Jag löste det genom att lägga in alla validatorer i en Hashtable men bara en för varje textbox och sedan uppdatera IsValid värdet. Jag får då ut alla TextBoxar och om de är IsValid eller inte.
Men nu vill jag flytta ut hela koden från min sida till en egen klass som jag enkelt kan infoga på alla sidor som jag vill ha samma effekt på. Men jag får två problem som jag inte riktigt vet hur man löser. Dels så kommer jag inte åt Page.Validators från min klass och jag kommer inte heller åt TextBoxarna med FindControl(textBoxName). Jag har testat med att ärva lite till höger och vänster men får det inte att fungera. :OO
mozillaMedlem sedan juli 20011 202 inlägg
Det ser inte så ljust ut, någon som vet hur man gör för att komma åt dem från min klass? Eller hu skulle ni ha gjort för att flytta ut hela funktionen till en fristående klass?
Jag skulle helst vilja att min funktion automatiskt körs på alla sidor i mitt projekt som har Validatorer på sidan. Tex att man overridar public void Validate(). Och att man eventuellt istället kan välja att stänga av dem om man inte vill ha den
BrimbaMedlem sedan dec. 19992 966 inlägg
Har du testat att bygga en egen kontroll (kolla min länk)?
emissionMedlem sedan dec. 19996 095 inlägg
Som jag ser det har du tre alternativ.
- Egna TextBoxar, enligt Brimbas förslag. Helt klart en väl fungerande och portabel lösning.
- Egna validatorer (nedärvda)
- Gör en BasePage-klass, dvs. en klass ärvd från Page, som gör "loop-jobbet", och låt alla sidor ärva från den, i stället för Page.
mozillaMedlem sedan juli 20011 202 inlägg
Så nu fungerar det :bire, längre fram kanske jag gör som ni förespråkar att skapa en egen SuperTextBox-klass med inbyggda validatorer osv. Men i dagsläget är jag nöjd med hur det fungerar. Jag gick på alternativ 3 och la in allt i min BasePage-klass istället för en egen, i den gjorde jag en override på validate()