Toon posts:

[Discussie/C#] Veldvalidatie

Pagina: 1
Acties:
  • 613 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik ben momenteel bezig met de ontwikkeling van een C# applicatie met daarin heel veel verschillende invoerelementen (met name textboxes). We weten allemaal dat een gebruiker niet te vertrouwen is en dat we alle invoer van de gebruiker moeten controleren voordat we er daadwerkelijk iets mee doen :P.

Dat brengt me meteen op mijn vraag. Hoe zorg ik ervoor dat ik al deze velden valideer zonder dat ik gigantische lappen code krijg die enorm vervelend zijn om te schrijven :D. Uiteraard kun je allerlei kleine methodes bouwen om input te valideren maar dit is ook geen doen op de lange duur.

Nu vraag ik me af hoe collega-programmeurs hier mee om gaan? Hebben jullie een grote library van kleine hulpmethodes om ingevoerde data te valideren? Alle ideeën en suggesties zijn welkom :D. We bevinden ons nu nog in het stadium dat ik wijzigingen op dit gebied kan doorvoeren. Over een aantal weken zal dit niet aantrekkelijk meer zijn wegens de grote hoeveelheid invoerelementen :P.

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10 08:18
een mogelijkheid is om (in een DB bijv.) een aantal checks te koppelen aan velden

je kan dus zeggen:

veldnaam: geboortedatum
checks: not-null, valid date

veldnaam: tussenvoegsel:
checks: -
max-lengte: 50 (bijv. lengte van je DB veld)


op deze manier kan je dynamisch je checks doen

This message was sent on 100% recyclable electrons.


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
^^
Wat is daar dynamisch aan ?

Zowiezo zal je -omwille van performance redenen en useability redenen- zowiezo aan de client kant ook moeten valideren.
Over welke validatie spreken we eigenlijk ? Gaat het over checken of een veld ingevuld is, of ga je ook checken of de inhoud van dat veld correct 'kan' zijn ?

https://fgheysels.github.io/


  • Rowdy.nl
  • Registratie: Juni 2003
  • Laatst online: 28-11 14:33

Rowdy.nl

Koekje d'r bij?

Ligt er natuurlijk aan wat je met die data wilt doen. Voornamelijk textboxen, maar wat wil je daaraan valideren? heb je er een adres ionstaan, of een postcode? Of wil je voorkomen dat er HTML in staat? Wil je de data opslaan in een database of er iets van genereren?

Persoonlijk gebruik ik vaak regex om bepaalde zaken te controleren, of de oldVar.TryParse(newVar) method... Komt zo'n actie vaak voor dan gooi ik 'm in een method.

Moet ik tekst bijvoorbeeld alleen opslaan in een database of ergens anders weergeven, dan valideer ik hoogstens of die ingevuld is. Daar kun je overigens ook een functie voor aanmaken die je bijvoorbeeld een ongedefinieerd aantal objecten (bv textboxes) meegeeft en die door die collectie van objecten heen laat lopen om te controleren of ze gevuld zijn....

Maar 't is misschien handig om eerst uit te leggen wat precies je uiteindelijke doel er mee is... ;)

Rowdy.nl - X++ by day. C# by night. I drink coffee in the morning and beer in the evening.


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:32

Janoz

Moderator Devschuur®

!litemod

Voor validatie in enkele J2ee Struts projecten heb ik gebruik gemakt van het jakarta validator framework. Deze heeft een heleboel standaard validaties, maar bied ook de mogelijkheid om eigen validaties te implementeren. Daarnaast heeft dat framework voor elke validatie een (serverside) java implementatie EN een (clientside) javascript implementatie. Ik kon bij de configuratie bestanden van mijn formulieren opgeven wat de validatie regels van elk veld waren (dit waren regels als verplicht, alleen cijfers tot en met 11 proef, creditcard test, reguliere expressies en minimaal x van de y checkboxes uitgekozen en combinaties van verschillende velden). De rest van de configuratie bestond uit einkele standaard foutmeldingen (inclusief tokens op de plekken waar veld specifieke namen ingevuld moesten worden).

Er is dus eigenlijk 1 grote library met hierin allemaal validators. Je inputvelden moet je eigenlijk uitbreiden zodat je hieraan 1 of meerdere validators toe kan voegen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10 08:18
whoami schreef op vrijdag 08 juni 2007 @ 10:30:
^^
Wat is daar dynamisch aan?
euh.. zie je dat niet?

je hoeft niet in je code dit soort ranzigheid te doen:

C#:
1
2
3
if (txtVeldnaam.Text.length > 0) {
  ...
}


maar maakt gewoon een loopje die door al je te controleren controls sjouwt en dan validate(control) aanroept oid
(of zelfs bij de onchange van het control)

[ Voor 5% gewijzigd door BasieP op 08-06-2007 10:45 ]

This message was sent on 100% recyclable electrons.


  • ColdSTone|IA
  • Registratie: December 2002
  • Laatst online: 28-12-2017

ColdSTone|IA

lui..

In asp.net is het mogelijk om zogenaamde validators aan je controls te koppelen, dit zal voor winforms apps ook wel mogelijk zijn.

Wat Janoz zegt dus, ongeveer dat principe.

[ Voor 15% gewijzigd door ColdSTone|IA op 08-06-2007 10:49 ]


  • Rowdy.nl
  • Registratie: Juni 2003
  • Laatst online: 28-11 14:33

Rowdy.nl

Koekje d'r bij?

@BasieP, je omschrijving was niet echt duidelijk in je eerste post, je tweede al iets beter... ;)

Maarre, TS, wat wil je nou met al die data doen? En wat gebruik je? ASP.net? Of gewoon een windows forms applicatie? ;)

@ColdSTone, ik had ook aan die validators gedacht, en gelijk even gekeken bij een winform applicatie, maar kan geen validator control vinden... :/

Rowdy.nl - X++ by day. C# by night. I drink coffee in the morning and beer in the evening.


Verwijderd

Topicstarter
Ik heb momenteel het volgende idee in mijn hoofd. Ik neem even als voorbeeld control een TextBox:

Op mijn form bevind zich een textbox met de naam txtTest. Deze mag afhankelijk van een boolean met de naam bOnlyNumeric enkel numerieke waardes of enkel alfanumerieke waardes bevatten.

Ik maak een tweetal Validators: ValidatorOnlyNumeric en ValidatorOnlyAlfanumeric.

Bij het initialiseren van mijn form maak ik een instantie aan van TextBoxValidator. Deze knoopt zichzelf aan de Leave (= event bij het verliezen van de focus) event. Vervolgens kijk ik naar de waarde van bOnlyNumeric en voeg ik een instance toe van de juiste validator. Wanneer de Leave event wordt getriggerd loopt TextBoxValidator een lijstje door met de ingestelde validators. Wanneer een validator een negatief resultaat heeft dan vertoon ik een error, stel de focus in op de control waar het fout ging en verlaat ik het controle proces.

Volgens mij moet dit best aardig werken. Ik zit echter met het volgende probleem. Hoe ga ik er voor zorgen dat ik een duidelijke en gebruikersvriendelijke melding geef aan de gebruiker. Uiteindelijk zal de validator deze melding moeten tonen. Dat is het component welke weet welke fout er opgetreden is. Iemand hier nog ideeën over.

Een melding als: "Er is een fout opgetreden: alleen numerieke waardes toegestaan." vind ik persoonlijk niet gebruikersvriendelijk. Dan heb ik liever een melding als: "U mag enkel numerieke waardes ingeven in het test veld". Hoe ga ik er voor zorgen dat de validator soortgelijke, context-afhankelijke en gebruikersvriendelijke meldingen laat genereren. Iemand ideeën?

  • L-VIS
  • Registratie: April 2005
  • Laatst online: 16:56
Meestal gebruik ik validators. Enkel en alleen om verplichte velden op invoer te checken, reg-ex op e-mail, postcode ed. Business logic komt uiteraard nooit in de frond-end.

  • Rowdy.nl
  • Registratie: Juni 2003
  • Laatst online: 28-11 14:33

Rowdy.nl

Koekje d'r bij?

Zoeken op validators voor winforms lijkt erop dat die er niet standaard zijn. Ik vind echter alleen oudere posts uit 2005 die veel verwijzen naar het Noogen.Validator Framework, en een enkele nieuwere naar een Sping.Validator FrameWork. (zal wel iets soortgelijks zijn)

Die eerste is overigens best netjes: Artikel op codeproject

Edit:

Ah, ik zie, ik vermoed uit je laatste post dat je dus gebruik maakt van ASP.net. (anders had je die textboxvalidator niet) je hebt daar toch een ErrorMessage property waar je een nette, eigen melding kunt opgeven?

[ Voor 21% gewijzigd door Rowdy.nl op 08-06-2007 11:07 ]

Rowdy.nl - X++ by day. C# by night. I drink coffee in the morning and beer in the evening.


  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10 08:18
Verwijderd schreef op vrijdag 08 juni 2007 @ 10:58:
Ik zit echter met het volgende probleem. Hoe ga ik er voor zorgen dat ik een duidelijke en gebruikersvriendelijke melding geef aan de gebruiker. Uiteindelijk zal de validator deze melding moeten tonen. Dat is het component welke weet welke fout er opgetreden is. Iemand hier nog ideeën over.
waarom geef je het object (textbox in dit geval) niet mee aan je validator ipv de tekst? (misschien doe je dat al) dan kan je wanneer de validatie faalt de naam van het element ophalen, en bijvoorbeeld de border rood maken, of de achtergrondkleur.
Je kan ook op de positie van het control een tooltip laten zien of iets in die geest
dat lijkt me erg gebruiksvriendelijk

This message was sent on 100% recyclable electrons.


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:32

Janoz

Moderator Devschuur®

!litemod

Bij de validator waar ik het over had had je in de algemene configuratie de volgende lijstjes:

validator.required = $1 is verplicht.
validator.greatherThan = $1 moet groter zijn dan $2.

Hier zat vervolgens ook nog een i18n laagje tussen. In de configuratie van een formulier gaf je vervolgens een naam op van het veld (Bijvoorbeeld Gebruikersnaam of Usernamen) en eventuele extra waarden. Bij het genereren van de foutmelding werdt uit de globale (ver i18n-de) tekstlijst de melding gehaald en werden de variabelen ingevuld.

Extra voordeel van de validator was de de configuratie onafhankelijk was vna waar het werd toegepast. Je had dus 1 configuratie waarmee je vervolgens een client side javascript validatie genereerde, maar dezelfde validatie ook nog eens serverside deed. Je hebt dan nooit problemen met dubbele administratie.

Ff een linkje naar de Lib. Goed, het is wel in Java, maar ik denk dat je wel een heleboel kunt hebben aan de ontwerpbeslissingen die zij hebben gemaakt.
http://jakarta.apache.org/commons/validator/

[ Voor 10% gewijzigd door Janoz op 08-06-2007 11:05 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Nee, want jij noemt het dynamisch, en ik vind het niet dynamisch. Dat zijn gewoon DB level constraints.
Wat niet wegneemt dat je best ook nog client-side valideert, en wel omwille van de redenen die ik al aangehaald heb.
je hoeft niet in je code dit soort ranzigheid te doen:

C#:
1
2
3
if (txtVeldnaam.Text.length > 0) {
  ...
}
Er zijn ook andere manieren om client-side validatie te doen ipv dergelijke dingen.

https://fgheysels.github.io/


  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10 08:18
whoami schreef op vrijdag 08 juni 2007 @ 11:24:
[...]
Er zijn ook andere manieren om client-side validatie te doen ipv dergelijke dingen.
mja die probeert de TS juist te vinden, en daar probeer ik hem bij te helpen...

This message was sent on 100% recyclable electrons.


  • sopsop
  • Registratie: Januari 2002
  • Laatst online: 01-12 14:29

sopsop

[v] [;,,;] [v]

Wat je zou kunnen doen is het plaatsen van een string in de .tag van de textbox. Bijvoorbeeld:
textbox1.tag = "required email".
Vervolgens kun je de inhoud van de textbox valideren door een voor een de waardes in de .tag te gebruiken om die validatie uit te voeren.

Een andere mogelijkheid is om gewoon voor de verschillende types validatie een specifieke usercontrol aan te maken.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:32

Janoz

Moderator Devschuur®

!litemod

sopsop schreef op vrijdag 08 juni 2007 @ 11:46:
Een andere mogelijkheid is om gewoon voor de verschillende types validatie een specifieke usercontrol aan te maken.
Het nadeel daarvan is dat je geen dingen kunt combineren. Denk bijvoorbeeld aan een wachtwoord dat verplicht is, gelijk moet zijn aan een ander veld en minimaal 8 tekens moet hebben. In plaats van het combineren van een paar simpele herbruikbare validators heb je nu 1 complexe single use validator.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Pagina: 1