ASP.net : Web Controls

  1. Wat zijn Web Controls ?
  2. Visual Studio.net en Web Controls
  3. Overzicht elementaire Web Controls
  4. Autopostback
  5. Input Validation Controls
  6. List Controls
  7. Oefeningen

Wat zijn Web Controls ?

In plaats van gebruik te maken van de HTML Controls is er een set van controls aanwezig genaamd Web Form Controls. Ze zijn gedefiniëerd in de namespace System.Web.UI.WebControls.

De reden voor deze extra set controls is dat HTML-controls veelal attributen ondersteunen met verwarrende namen : het size-attribuut geeft je bijvoorbeeld in een listbox het aantal zichtbare rijen (onder elkaar), in textbox stelt dit attribuut de breedte in. Van een textarea wordt de breedte dan weer aangegeven met het rows-attribuut. Je merkt, een heel chaotische naamgeving van attributen.

Met de Web Form Controls beschik je over een set server-side controls die consequent zijn in het gebruik van attributen. Deze controls worden bij uitvoer naar de browser vertaald in de respectievelijke HTML-elementen.

Visual Studio.net 2005 en Web Controls

Toepassing

De Web Controls worden door VS.net als standaardelementen gebruikt. Het is dus hier dat je kan inpikken in de cursus en kan meewerken met Visual Studio.net.

Wij werken in VS 2005 met de codebehind-techniek, een manier om de opmaakcode (plaatsing van de elementen) en logische code van elkaar te scheiden. We maken een kleine toepassing ter illustratie:

CodeBehind

Het is belangrijk in te zien hoe de codebehind-techniek werkt:

Het bestand KlikForm.aspx.cs bevat een klasse _Default, deze klasse erft over van System.Web.UI.Page: de basisklasse voor elke asp.net pagina. De klasse _Default bevat dus door overerving alle methoden en eigenschappen van de klasse Page.

Sinds C# 2.0 wordt gewerkt met een gedeeltelijke klassen op partial classes: een manier om een klasse te splitsen over verschillende bestanden. Concreet zal het .Net FrameWork bij het uitvoeren van een pagina een klasse genereren die objectreferenties bevat naar alle objecten die we op een pagina KlikForm.aspx hebben geplaatst (in het eerste voorbeeld een Button en een Label). Deze klasse wordt samengevoegd met onze eigen CodeBehind-klasse _Default in KlikFom.aspx.cs.
Vandaar dat we in de CodeBehind zonder probleem kunnen verwijzen naar objecten van de webpagina, als staan deze objecten er niet expliciet gedeclareerd.

Elementaire ASP.net Web Form Controls

Wanneer je werkt met de Web Form Controls, dan zal je merken dat deze algemeen in de code worden weergegven door een tag die start met asp:.

Er zijn heel wat Web Form Controls. Wat je zeker moet inzien is dat de browser deze tags niet kent. Deze tags dienen op de server verwerkt te worden en te worden omgezet in correcte HTML-tags.

Op deze manier zullen wij verderop in de cursus onze eigen controls maken: we kiezen een eigen naam voor de tag en leren de server hoe de control moet worden omgezet in HTML/javascript - code.

WebControl Maakt HTML-tag
ASP:Hyperlink A
ASP:LinkButton A met IMG
ASP:Image img
ASP:Panel div
ASP:Label span
ASP:Button input type="submit" of "button"
ASP:Textbox input type="text" of "password" of textarea
ASP:CheckBox input type="checkbox"
ASP:RadioButton input type="radio"
ASP:ImageButton input type="image"
ASP:table table
... ...

Elk van deze controls heeft tal van eigenschappen, het is niet de bedoeling in deze cursus om elke control gedetailleerd te beschrijven. Het is wel algemeen zo dat de eigenschappen van een control ingesteld kunnen worden via het eigenschappenvenster (F4), via de source-code, maar ook runtime kunnen aangepast worden in methodes in een codebehind file.

Voorbeeldtoepassing: afmeting en kleur van een Panel veranderen

Maak een toepassing waarbij je met behulp van twee knoppen een divisie breder kan maken en de kleur ervan kan veranderen.

Oplossing: in een nieuwe Web Site plaats je volgende controls op de pagina:

Zorg voor de volgende code in de CodeBehind-file:

...
using System.Drawing;
...
private void CmdBreder_Click(object sender, System.EventArgs e)
{
			//Paneel breder maken
			Paneel.Width = Unit.Pixel((int)Paneel.Width.Value + 5);
}

private void CmdKleur_Click(object sender, System.EventArgs e)
{
	//definieer de verschillende kleuren
	string[] kleuren = { "red", "blue", "black", "pink", "white" };

	//lees de huidige waarde van de teller (verborgen formulierveld)
	int teller = Convert.ToInt32(HFteller.Value);

	//teller ophogen, indien te hoog weer op nul
	if (++teller >= kleuren.Length) teller = 0;

	//Paneel instellen op juist kleur
	Paneel.BackColor = Color.FromName(kleuren[teller]);

	//Tellerwaarde wegschrijven in verborgen formulierveld
	HFteller.Value = teller.ToString();
}

Belangrijk is hierbij de techniek met een verborgen veld om de waarde van de teller te bewaren. Met een gewone variabele kan je geen informatie tussen verschillende pagina-aanvragen bewaren: http is stateless.

We zullen later zien dat er hiervoor wel nog andere technieken bestaan dan het werken met verborgen velden.

Een belangrijke opmerking hierbij: deze toepassing leent er zich in principe beter toe om client-side met bijvoorbeeld javascript te worden opgelost. Het is belangrijk dat je goed inziet dat telkens wanneer je in deze toepassing de breedte of de kleur van het Paneel wijzigt, er een repost naar de server gebeurt, dit is het PostBack-principe van ASP.net !

AutoPostBack

Bepaalde ASP.NET Web Form Controls (TextBox, CheckBox, RadioButton), en ook alle list controls verderop in de cursus hebben een eigenschap AutoPostBack. Deze eigenschap stelt je in staat om bij een verandering in de control het formulier automatisch naar de server te laten terugsturen.

AutoPostBack.aspx bevat:

AutoPostBack.aspx.cs
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace AutoPostBack
{
	
	public partial class AutoPostBack : System.Web.UI.Page
	{
	
		private void Page_Load(object sender, System.EventArgs e)
		{

		}

		private void MijnCode(object sender, System.EventArgs e)
		{
			CheckBox c = (CheckBox)sender;
			L.Text += "Verandering vastgesteld in " +c.ID 
				+"<br>De waarde is nu: " +c.Checked
				+"<br>Tekstwaarde: " +c.Text +"<hr>";
		}

	}
}

Wanneer je de broncode opvraagt in de browser, dan merk je dat er client-side javascriptcode werd gegenereerd die ervoor zorgt dat formuliergegevens worden verstuurd wanneer de gebruiker een actie onderneemt.

Bij een repost naar de server worden de verborgen formuliervelden __EVENTTARGET en __EVENTARGUMENT naast __VIEWSTATE meegestuurd. Aan de hand van deze formuliervelden kan de server uitmaken welk control werd beïnvloed en welke server-side code moet worden uitgevoerd. In dit voorbeeld wordt bij het klikken (dus eigenlijk veranderen) van het aankruisvakje of een selectierondje de methode MijnCode uitgevoerd.

In deze routine typecasten we het eerste ontvangen argument van de klasse Object naar CheckBox: we zijn zeker dat het object dat de actie veroorzaakt tot deze klasse behoort (RadioButton erft over van CheckBox).

Een RadioButton is dus in feite afgeleid van een CheckBox in ASP.NET. Een RadioButton heeft een extra eigenschap : GroupName. Dit resulteert client-side in het name-attribuut voor de RadioButton. Gekoppelde radiobuttons (een groep waarin je maar eentje kan selecteren) geef je dus dezelfde waarde voor GroupName.

Merk op dat wanneer je op het reeds geselecteerde selectierondje klikt de pagina ook wordt teruggestuurd maar nu wordt MijnCode niet uitgevoerd

Input Validation Controls

Overzicht

Een van de vermoeiendste taken voor een ontwikkelaar is het controleren of de input van de user beantwoorde aan de gestelde vereisen. Om dit te vergemakkelijken werden in ASP.net de User Input Controls voorzien:
Control Omschrijving
asp:RequiredFieldValidator Controleert of een formulierveld een 'value' bevat. De waarde mag niet leeg zijn.
asp:RangeValidator Controleert of de waarde van een control binnen een numeriek of alfanumeriek bereik ligt.
asp:CompareValidator Controleert of de waarde van de gevalideerde control overeenkomt met de waarde van een andere control of een specifieke waarde. Het gegevenstype en vergelijkingsoperator kunnen gekozen worden. Als de gevalideerde control geen waarde bevat, dan gebeurt er geen validatie.
asp:RegularExpressionValidator Controleert of de gevalideerde waarde beantwoord aan een reguliere expressie. Als de control leeg is dan is er gen validatie.
asp:CustomValidator Doet een door de gebruiker gedefiniëerde controle op een control (client-side, server-side of allebei).
asp:ValidationSummary Geeft een overzicht van de huidige validatiefouten.

Achtergrond

Alle validatiecontrols erven van de basisklasse BaseValidator die deel uitmaakt van de klasse System.Web.UI.WebControls.

Elke validatiecontrol heeft daar naast specifieke eigenschappen en methoden (en voor de CustomValidatorcontrol ook een event).

De input validation controls kunnen zowel client- als serverside controle op gegevens uitvoeren. Om client-side controle uit te voeren maken de formulierelementen gebruik van Javascript. De benodigde javascript-routines staan in een het bestand aspnet_client\system_web\versie_n\WebUIValidation.js.

Heb je dit bestand niet, dan kopiëer je de map aspnet_client uit \inetpub\wwwroot of gebruik je aspnet_regiis -c (bevindt zich in C:\WINDOWS\Microsoft.NET\Framework\versie_n) vanaf de command prompt om deze bestanden aan te maken.

Input Validation Controls Gebruiken

Deze Web Form Controls hebben tal van verschillende eigenschappen. De belangrijkste:
Eigenschap Betekenis
Display
  • Dynamic: de control neemt enkel plaats in als hij zichtbaar is
  • Static: voor de control wordt steeds plaats gereserveerd
  • None: de control wordt niet getoond (is handig wanneer je met een ValidationSummary werkt)
ID Naam voor de validatiecontrol
ControlToValidate De control die aan een validatie wordt onderworpen
ErrorMessage Bericht dat wordt getoond als een foutieve waarde is ingegeven
EnableClientScript Client-side validatie instellen
Enabled Server-side validatie instellen
ControlToCompare Bij CompareValidator: control waarmee vergeleken wordt
ValueToCompare, Operator, Type Bij CompareValidator: instellen met welke type en waarde er moet worden vergeleken, en hoe er vergeleken moet worden
MaximumValue Bij RangeValidator: maximumwaarde
MinimumValue Bij RangeValidator: minimumwaarde
ValidationExpression Bij RegularExpressionValidator: expressie die gebruikt wordt voor de controle
OnServerValidate Bij CustomValidator: routine voor afhandelen van de server-side controle
ClientValidationFunction Bij CustomValidator: routine voor afhandelen van de client-side controle
HeaderText Bij ValidationSummary: koptekst voor foutrapport
ShowSummary Bij ValidationSummary: foutrapport weergeven of verbergen
DislayMode Bij ValidationSummary: layout voor het foutrapport - List, BulletList of SingleParagraph

Validatie controleren

Je kan server-side detecteren of controles goed zijn verlopen via de IsValid-property van het Page-object (de eigenlijke webpagina).

Validatie uitschakelen

Stel dat je een knop in het formulier wil aanbrengen waarmee de gebruiker het invullen van een formulier kan annuleren, dan zorgt deze knop standaard voor een postback naar de server en zal deze zorgen voor validatie. Je kan ervoor zorgen dat na het indrukken van de knop geen validatie gebeurt door de eigenschap CausesValidation op false in te stellen.

List Controls

Overzicht

Met deze server-side controls kan je lijsten genereren die veelal SELECT-elementen in HTML als resultaat geven. Er zijn echter heel krachtige List-Controls die een ander resultaat genereren, zoals het automatisch genereren van datatabellen.

Control Omschrijving
DropDownList Maakt een SELECT-list met size="1". De lijst kan gevuld worden met LISTITEM-Controls of door data binding.
ListBox Maakt een SELECT-lijst met size="x". De lijst kan gevuld worden met LISTITEM-Controls of door data binding.
CheckBoxList Maakt een HTML-tabel of lijst met HTML-checkboxen. De lijst kan gevuld worden met LISTITEM-Controls of door data binding.
RadioButtonList Maakt een HTML-tabel of lijst met elkaar uitsluitende HTML-radiobuttons. De lijst kan gevuld worden met LISTITEM-Controls of door data binding.
ListItem Is niet echt een control maar wordt gebruikt om bepaalde andere controls te vullen. Deze Control maakt de OPTION-tags of bv. een nieuwe checkbox in een CheckBoxList Control.
Repeater Herhaalt bepaalde inhoud voor elk bronelement van een datasource die je hebt ingesteld.
DataList Maakt een HTML-tabel met een rij voor elk bronelement dat je specifiëert.
DataGrid Maakt een HTML-tabel voor server-side data binding en heeft ingebouwde functies voor sorteren en manipuleren van de weergegeven rijen.

Achtergrond

De eerste vier Controls uit bovenstaande tabel zijn afgeleid van de klasse ListControl die deel uitmaakt van de namespace System.Web.UI.WebControls en erft uit de klasse WebControl.

Elk van de afzonderlijke Controls vormt een nieuwe klasse met eventueel nieuwe properties en methodes.

Gebruik

De Controls die we hierboven besproken hebben erven uit de klasse System.Web.UI.WebControls.ListControl het event SelectedIndexChanged.

In dit voorbeeld worden de Listbox, Dropdownlist en RadioButtonList samen gebruikt en wordt telkens getoond welke Control werd aangepast. Door de AutoPostBack-property telkens op true te zetten moeten we zelfs niet op een knop drukken.

Met VS.net kan je deze controls op een webpagina slepen en de inhoud bepalen via de eigenschap Items.
De items worden in de code vertaald in ListItem-Controls.

Oefeningen

Oefeningen

Meer tutorials:
leer ook: html | xhtml | css | asp | asp.net | c# | ado.net | linq | ajax | java | javascript
Valid HTML 4.01! Valid CSS! © - Cursusweb