# Programmeren in ASP.NET/Validering
## Wat is validering?

Validering is het onderwerpen van data aan een gegeven verzameling regels. In ASP.NET is het dikwijls de invoer van bezoekers die we willen valideren in een web formulier. Er zijn een aantal redenen waarom we dit zouden willen doen. Enkele simpele voorbeelden:
* Er werden geen of onvolledige gegevens ingevoerd
* De waarde van de ingevoerde gegevens is niet binnen de juiste grenzen
* Het formaat van de ingevoerde gegevens is niet correct

## ASP.NET-valideringcontrols

In ASP.NET is validering gemakkelijk toe te voegen door middel van een verzameling controls die valideringcontrols genoemd worden.
Er zijn 5 types individuele valideringcontrols. Dit zijn ze:
* RequiredFieldValidator
* CompareValidator
* RangeValidator
* RegularExpressionValidator
* CustomValidator
De Required Field Validator zorgt ervoor dat de gebruiker iets moet invullen. Het mag eender wat zijn, maar de gebruiker kan het veld niet leeg laten.
De Compare Validator en de Range Validator vergelijken beide de invoer (in de aard van x>y). Het verschil tussen beide is dat de Compare Validator maar één kant controleert, terwijl de Range Validator zowel een ondergrens als een bovengrens kan opleggen.
De RegularExpression Validator controleert de invoer met een reguliere expressie. Enkele veelgebruikte expressies, zoals voor een e-mail-adres, zijn direct beschikbaar.
Als geen enkele validator voor jou past, dan kan je je eigen criteria schrijven en het in een Custom Validator inkapselen.
Naast deze individuele valideringcontrols, is er nog een laatste soort: de Validation Summary Control. Deze control laat je toe om gemakkelijk te controleren of elke validator op een pagina voldaan is of niet, in de plaats van ze elk afzonderlijk te checken.
Een interessante eigenschap van valideringcontrols is dat ze automatisch client-side-validering uitvoeren via JavaScript in recente browsers. De validering gebeurt hoe dan ook nogmaals op de server, maar je krijgt automatisch het voordeel van onmiddellijke feedback als de gebruiker een recente browser gebruikt. Je hoeft zelfs geen client-side-code te schrijven.
Belangrijk: omdat er geen client-side-validering gebeurt om andere browsers dan Internet Explorer, en omdat zelfs Internet Explorer-gebruikers toch JavaScript kunnen uitschakelen, moet je op de server nog altijd controleren of de validering gelukt is, vooraleer je andere code uitvoert. Dit moet je doen met
Nota: (ASP.NET 1.x) De client-side code voor validering staat in een bestand "WebUIValidation.js. Om validering te laten werken, moet dit bestand in een subfolder "aspnet_client\system_web\xxxxxxx" in de root van de website staan (xxxxxxxx is de versie van het .NET framework). In ASP.NET 2.0 is dit niet meer nodig, daar wordt een javascriptbestand automatisch op de server gegenereerd.

## Voorbeelden

Hier is een simpel voorbeeld dat een RequiredFieldValidator gebruikt om ervoor te zorgen dat de gebruiker een naam invult:
required.aspx
Je kan ook op voorhand al een waarde invullen, en eisen dat de gebruiker deze waarde verandert. Dit doe je met de eigenschap "InitialValue" van de RequiredFieldValidator.
Hier is een ander voorbeeld, deze keer met een RangeValidator:
range.aspx
Opmerkingen
* Vergeet bij de RangeValidator of CompareValidator niet de property "Type" in te stellen. Standaard staat dit op "String", maar voor getallen geeft dit foutieve resultaten (de string "2" is groter dan de string "10"!).
* Naast tekstvakken kan je nog de volgende controls valideren: ListBox, DropDownList, RadioButtonList, HtmlInputText, HtmlInputFile, HtmlSelect en HtmlTextArea.
* Je mag meerdere validators op één enkele control zetten. Dit is soms nodig, want de CompareValidator en de RangeValidator controleren niet of de waarde niet leeg is. Als je een bepaalde waarde wil controleren, én de waarde mag ook niet leeg zijn, dan moet je 2 validators gebruiken.

### Oefeningen

* Schrijf een pagina waar je je adres en telefoonnummer moet ingeven. Doe de gepaste validering
* Schrijf een pagina waar je 3 multiple-choice vragen moet beantwoorden. Controleer of de 3 vragen werkelijk beantwoord werden (goed of fout heeft geen belang).
* Schrijf een validator voor een wachtwoordvak. Het wachtwoord moet altijd minstens 1 letter en 1 cijfer bevatten.
* Schrijf een formulier met twee wachtwoordvakken. De beide waarden moeten identiek zijn.
* Schrijf een formulier waar je een datum moet ingeven. Het moet een datum zijn die al voorbij is. Tip: omdat de ValueToCompare variabel is, moet je de waarde ervan instellen in Page_Load.

## CustomValidator

Als er geen validator is die exact doet wat je wil, dan kan je je eigen valideringsfunctie schrijven. Gebruik de CustomValidator-control, en gebruik het event OnServerValidate.
De handler voor dit event ziet er zo uit:
Zoals je merkt moet je de waarde van args.IsValid instellen naargelang het formulier goed of slecht ingevuld is.
Indien je wil kan je zelfs client-side-validering toevoegen met behulp van de ClientValidationFunction-property. Voeg dan een javascriptblok toe aan de pagina met de betreffende functie erin. Deze functie moet true of false geven naargelang de validering gelukt is of niet.
Bij een CustomValidator is het niet verplicht de ControlToValidate-property in te stellen.

### Oefeningen

* Maak een formulier waar de gebruiker een even getal moet invullen. Gebruik validering.
* Schrijf een pagina waar je moet ingeven welke talen je spreekt. Zorg ervoor dat minimaal één taal gekozen moet worden.
* Schrijf een pagina waar je een geschenk mag kiezen. Uit 4 mogelijkheden moet je er exact 2 aankruisen. Controleer of de keuze hieraan voldoet.

## Validation Summary

Hier is een script dat het gebruik van de Validation Summary-control illustreert:
summary.aspx
Merk op dat beide validators een Display-attribuut "None" hebben. Deze optie werkt samen met de summary-validator, zodanig dat de fout alleen in de summary getoond wordt, en niet nog eens in de aparte validators.
Display heeft drie mogelijke instellingen:
* None: de fout wordt niet getoond (als er een summary-validator is waar de fout wel getoond wordt)
* Static: de fout wordt getoond en de ruimte voor de foutboodschap wordt altijd ingenomen, ook als er geen fout optreedt
* Dynamic: de fout wordt getoond en de ruimte voor de foutboodschap wordt alleen ingenomen als er een fout is. Anders wordt deze ruimte "samengeklapt"

## Validering uitschakelen voor sommige knoppen

Soms gebruik je een knop "Annuleren" of "Cancel" op je pagina. Als je op deze knop drukt wordt er normaal gezien ook validering toegepast. Maar dat betekent dat je het formulier eerst correct moet invullen voor je op "Annuleren" kan drukken!
Om dit probleem op te lossen heeft elke knop ook een eigenschap "CausesValidation", die standaard op "True" ingesteld staat. Als je deze op "False" zet voor de "Cancel"-knop, dan wordt er voor die knop geen validering uitgevoerd.

## Validatiegroepen (ASP.NET 2.0)

In ASP.NET 1.x is er een probleem als je meerdere formulieren op één pagina wil gebruiken. Dit komt meer voor dan je denkt, bijvoorbeeld als je een kalender-control hebt en op dezelfde pagina een vakje om in te loggen. In een dergelijk geval zullen validator-controls het tweede formulier blokkeren zolang het eerste niet goed ingevuld is, en omgekeerd.
In ASP.NET 2.0 is dit probleem opgelost door de invoering van validatiegroepen.
Het enige wat je moet doen is de eigenschap ValidationGroup instellen voor de verschillende validatiecontrols, en voor de overeenkomstige submit-knoppen. Controls die bij mekaar horen moet je dezelfde waarde geven. In het voorbeeld hieronder zijn er twee validatiegroepen: Groep1 en Groep2.
validatiegroepen.aspx
Als je nu Groep1 niet invult, kan je toch Groep2 nog versturen, en omgekeerd.