Querdenker - das Online-Magazin mit News zum Nachdenken
Nr. 6 - Oktober/November/Dezember 2001 - Bedenkenswertes, Erlesenes und Quergedachtes
Linie horizontal

ASP.NET (II) -
Einführung ins "Next Generation"-Programming

Dieser Artikel basiert auf der Beta 2 des .NET Frameworks SDK. Bezüglich des ASP.NET kann man davon ausgehen, dass die Version "Feature-stabil" ist. Dies bedeutet, dass nur mehr Bugs beseitigt und keine bestehenden Features umgearbeitet werden sollen.

Lesen Sie im Archiv auch früher erschienene Artikel zu ASP.NET und MS.NET! Den ersten Teil unsers Artikels Einführung ins "Next Generation"-Programming finden Sie in der Nummer 4, der zweite Teil liegt hier. Vorsicht: Teilweise beruhen diese Artikel noch auf der Beta1 und seitdem wurde fast der komplette Namespace geändert!

3. Seiten mit ASP.NET

3.2 Serverseitige Verarbeitung von Client-Events

Die Situation wird ihnen bekannt vorkommen: Ein User bekommt ein Formular zur Eingabe vorgesetzt, er soll irgendetwas ankreuzen, angeben oder eintragen. Bisher wurden die meisten dieser Angaben des Users clientseitig geprüft und danach erst an den Server abgesendet. Worauf dieser Server einen Verarbeitungsprozess angestossen hat, etwa in eine Datenbank geschrieben hat oder die Daten eben auf andere Art verarbeitete.

Jetzt besteht aufgrund der Server Controls die Möglichkeit derartige Formularelemente gleich am Server laufen zu lassen, Event-Handler wie zum Beispiel "onclick" serverseitig zu verarbeiten. Dies ermöglicht natürlich auch eine umso schnellere Reaktion des Servers auf die User-Eingaben. War der Browser bisher auf diverseste DHTML-Fähigkeiten oder besondere Scripting-Features angewiesen, so sendet der Client jetzt einen "postback event" an den Server, der alles weitere erledigt und so den Client-Browser von gewissen Grundbedürfnissen entlastet.

Unser Beispiel zeigt drei Server Controls in einem einfachen Formular, wie es wohl millionenfach im Web vorkommt. Eine Checkbox soll eine User-Auswahl ermöglichen, in der dieser ankreuzt, ob er weitere Infos von einer Firma bekommen möchte. Je nach Auswahl reagiert der Server mit einer entsprechenden Ausgabe auf der gleichen Seite.

Der Quelltext:

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <html>
    <head>
    <script language="vb" runat="server">
               Sub ClickHandler(Sender As Object, E As EventArgs)
                   If Request("Informationshaekchen") = "on" then
                      Botschaft.Text = "Wir melden uns in Kürze bei Ihnen"
                   else
                      Botschaft.Text = "Sie erhalten keine weiteren Informationen von uns!"
                   end if
               End Sub
    </script>
    <title>Demo einer serverseitigen Verarbeitung</title>
    </head>
    <body>
    <form runat="Server">
    <span style="font:italic normal bolder 12pt Arial">
    <ASP:Checkbox ID="Informationshaekchen" Text="Möchten Sie weitere Informationen von uns?"
Runat="Server" /> <br> <br> <ASP:Button ID="Button1" Text="Absenden" onclick="ClickHandler" runat="Server" /> <br> <br> <ASP:Label ID="Botschaft" Runat="Server" /> </span> </form> </body> </html>

Screenshot des neuen Visual Studio 7 Beta 2
Visual Studio 7 Beta 2 - da kann auch der 19 Zöller schon zu klein sein ...

Hier die Screenshots zu obigem Code-Beispiel, gleich mit der jeweiligen Quellcode-Ansicht:

1 - erster Aufruf - vor dem Ausfüllen

Screenshot vor dem Ausfüllen

2 - nach Absenden mit angekreuzter Checkbox

Screenshot nach dem Absenden/Checkbox angekreuzt

3 - nach Absenden ohne Checkbox anzukreuzen

Screenshot nach dem Absenden ohne Ankreuzen

Wiederum auffallend ist, dass das Server Control ASP:Label das Äquivalent zum bisherigen span-tag in HTML ist und dementsprechend an den Client gesandt wird. Besonders hervorzuheben wäre unserer Ansicht nach die grosse Flexibilität dieser Server Controls-Anwendungen und im Hinblick darauf - mit wie wenig Code sich derartige Abfragen realisieren lassen.

3.3 Übersicht über die ASP.NET Controls

Bisher haben wir uns eigentlich nur um die "eigentlichen" intrinsischen Controls von ASO.NET gekümmert. Diese zeigen jedenfalls direkt auf die entsprechenden HTML-Elemente, dies sind also:

  • ASP:RadioButton = input type=RADIO

  • ASP:ListBox = SELECT Elemente

  • ASP:CheckBox = input type=CHECKBOX

  • ASP:TextBox = input type=TEXTAREA

  • ASP:DropDownList = SELECT Elemente

Verwendet werden können diese Art der Controls in folgender Art und Weise:

<ASP:RadioButton ID="MeinRadioButton" Text="Bitte hier ankreuzen" runat="Server" />


Weiters gibt es folgende Controls:

  • Rich Controls
  • Calendar
  • Ad Rotator
  • List Controls
  • DataGrid Control
  • Repeater Control
  • Data List Control
  • Validation Controls
  • User Controls

Leider haben wir nicht die Zeit auf alle Controls ausführlich einzugehen, wir werden aber die Wichtigsten näher beschreiben.

3.3.1 Rich Controls

Derzeit werden mit der Beta2 des Visual Studios nur 2 "Rich Controls" ausgeliefert, nämlich das Calendar Control und die bereits aus ASP 3.0 bekannte Ad Rotator-Komponente. Microsoft behauptet aber, viele weitere Rich Controls in Zukunft auszuliefern.

3.3.2 Calendar Control

Dieses Control ist eine nahezu selbsterklärende Control-Variante, die mit dem Aufruf

<ASP:Calendar runat="Server" />

relativ umfassende Kalenderfunktionen- und darstellungen zur Verfügung stellt. Über eine Reihe von Attributen kann dieser Kalender formatiert und gestaltet, ebenso in lokale Varianten umgebaut werden. Aufgrund der Simplizität dieses Controls verzichten wir hier auf weitere Ausführungen hierzu. Es ist wirklich einfach einzubauen.

3.3.3 Ad Rotator Control

Die bisher sicherlich nicht sehr oft verwendete Ad Rotator-Komponente wurde als Control ein wenig verbessert und kommt jetzt als XML-File daher, welches dann in der .aspx-Seite eingebunden wird. Sicherlich ist ein automatischer Bannerwechsel wie es das Ad Rotator Control zur Verfügung stellt, leicht zu realisieren, kommt aber ebenso nicht an professionelle Tools dieser Gattung heran. Für einfachere Sites ist das Control aber sicherlich ausreichend.

3.3.4 List Controls

Die List Controls bestehen aus dem DataGrid Control, dem Repeater Control und dem DataList Control, die wir uns alle näher ansehen werden, da diese sicherlich häufig zum Einsatz kommen. Diese List Controls funktionieren in Verbindung mit ADO.NET und dienen dem "Data Binding" von Recordsets an eine bestimmte Darstellungsform der Daten. Eine Bindung der Daten an Arrays oder an Templates zur einfacheren grafischen Darstellung sind leicht zu realisieren.

3.3.5 DataGrid Control

Mit einem Minimum an Aufwand kann man mittels dem DataGrid Control aus der Datenbank herausgekitzelte Informationen in grafisch aufbereitete HTML-Tabellen stecken. Selbstverständlich basiert auch dieses einfache Beispiel auf der Beta 2. Also, der Code:

    <%@ Import Namespace="System.Data" %>
    <%@ Import Namespace="System.Data.SQLClient" %>
    <html>
    <head>
    <title>Data Grid-Beispiel</title>
    <script language="VB" runat="server">


	    Sub Page_Load (Sender As Object, E As EventArgs)
	
		 Dim MeinDatenset    As DataSet
		 Dim MeineConnection As SQLConnection
		 Dim MeinCommand     As SQLDataAdapter
		 
		 MeineConnection = New SQLConnection("server=localhost;database=pubs;
Trusted_Connection=yes") MeinCommand = New SQLDataAdapter("select * from Authors", MeineConnection) MeinDatenset = New DataSet() MeinCommand.Fill(MeinDatenset, "Authors") DataGrid1.DataSource=MeinDatenset.Tables("Authors").DefaultView DataGrid1.DataBind() End Sub </script> </head> <body> <h3><font face="Verdana">Ein einfaches Beispiel für das DataGrid-Control</font></h3> <ASP:DataGrid id="DataGrid1" runat="Server" Width="700" BackColor="#ccccff" BorderColor="black" ShowFooter="false" CellPadding=3 CellSpacing="0" Font-Name="Verdana" Font-Size="8pt" HeaderStyle-BackColor="#aaaadd" EnableViewState="false" /> </body> </html>

liefert folgende Browser-Ausgabe:

Screenshot eines einfachen DataGrid-Beispiels

Das Data Grid-Control ist also auf den ersten Blick eine einfache Art und Weise, seine Datenbankinhalte zu präsentieren. Die Ersparnis an Code-Zeilen fällt sicher jedem auf: Kein Herumgetödel mit Recordsets.EOF und while/do loop-Schleifen. Ganz abgesehen vom endlosen Befüllen der Tabellenzellen mit Response.Write. Das asp: DataGrid stellt darüber hinaus eine Reihe von Attributen zur Verfügung, die der Gestaltung der grafischen Ausgabe dienen. Im obigen Beispiel wurden einige von ihnen verwendet.

3.3.6 Repeater Control

Dieses Control dient ebenfalls der Datenausgabe. Allerdings gibt das Repeater Control zunächst einmal gar keine grafische Ausgabe zurück. Dazu ist es notwendig, sogenannte Templates zu verwenden. Fünf dieser Templates werden mitgeliefert:
HeaderTemplate, FooterTemplate, ItemTemplate, AlternatingItemTemplate, SeperatorTemplate - aus Platzgründen können wir hier nicht näher auf die Unterschiede eingehen. Jedenfalls müssen diese Templates bei der Ausgabe eingebunden werden, da es eben sonst zu keinerlei Ausgabe kommt. Alle spezifischen HTML-Tags und Style-Tags, die der grafischen Aufbereitung dienen, können hier untergebracht werden. Durch diese Code-Trennung ist es auch wirklich einfach, diese Templates immer wieder zu verwenden und sich so langsam eine Template-Kollektion aufzubauen. Der Aufbau dieser Templates ist hierarchisch. Zum besseren Verständnis ein kurzes Beispiel:

    <%@ Import Namespace="System.Data" %>
    <%@ Import Namespace="System.Data.SQLClient" %>

    <html>
    <head>
    <script language="vb" runat="server">

	 Sub Page_Load(Sender As Object, E As EventArgs)
	
		Dim MeinDataSet     As DataSet
		Dim MeineConnection As SQLConnection
		Dim MeinCommand     As SQLDataAdapter
		
		MeineConnection = New SQLConnection("server=localhost;database=pubs;Trusted_Connection=yes")
		MeinCommand = New SQLDataAdapter("select * from Titles", MeineConnection)
		
		MeinDataSet = New DataSet()
		MeinCommand.Fill(MeinDataSet, "Titles")
		
		MeinRepeater.DataSource = MeinDataSet.Tables("Titles").DefaultView
		MeinRepeater.DataBind()
		
	 End Sub

    </script>
    </head>
    <title>Ein einfaches Repeater-Control-Beispiel
    </title>
    <body topmargin="0" leftmargin="0" marginwidth="0" marginheight="0" >
    <table width="100%" cellspacing="0" cellpadding="0">
    <tr>
      <td style="height:20" bgcolor="#9C0001" cellspacing="0" cellpadding="0" width="100%" />
    </tr>
    <tr>
      <td align="right" style="height:70;font-family:Arial;font-weight:bold;font-size:44pt;
color:white" width="100%" bgcolor="D3C9C7">                        
              Unsere Top-Angebote: 
      </td>
    </tr>
    </table>

    <asp:Repeater ID="MeinRepeater" Runat="server">
	
	 <HeaderTemplate>
		<table width="100%" style="font: 10pt Verdana">
			<tr style="background-color:DFA894">
				<th>
					Titel
				</th>
				<th>
					Titel ID
				</th>
				<th>
					Typ
				</th>
				<th>
					Herausgeber ID
				</th>
				<th>
					Preis
				</th>
			</tr>
	 </HeaderTemplate>
	 <ItemTemplate>
			<tr style="background-color:FFECD8">
				<td>
					<%# DataBinder.Eval(Container.DataItem, "title") %>
				</td>
				<td>
					<%# DataBinder.Eval(Container.DataItem, "title_id") %>
				</td>
				<td>
					<%# DataBinder.Eval(Container.DataItem, "type") %>
				</td>
				<td>
					<%# DataBinder.Eval(Container.DataItem, "pub_id") %>
				</td>
				<td>
					<%# DataBinder.Eval(Container.DataItem, "price", "ATS {0}") %>
				</td>
			</tr>
	 </ItemTemplate>
	 <FooterTemplate>
		</table>
	 </FooterTemplate>
		
    </asp:Repeater>

    <table width="100%" cellspacing="0" cellpadding="0">
    <tr>
      <td style="height:20" bgcolor="#9C0001" cellspacing="0" cellpadding="0" width="100%" />
    </tr>
    </table>

    </body>
    </html>

    

liefert folgende Ausgabe:

Screenshot eines Beispiels für das Repeater-Control

3.3.7 Data List Control

Dieses Control dient zwar auch der Datenausgabe, ist aber ein wenig komplizierter zu handlen als die beiden vorher vorgestellten Controls, da diese reine Ausgabe-Controls sind. Durch das Data List Control ist eine individualisierte Ausgabe-Kontrolle durch Interaktion möglich. Durch Attribute wie etwa "RepeatColumns" oder "RepeatDirection" können Tabellen individuell gerendert werden. Mitgeliefert werden Templates, die optional bereits bestimmte Situationen abdecken.

Ein sehr schönes Beispiel für das Data List Control findet sich - wie so oft - in der MSDN Library unter der .NET Framework General Reference - hier der leicht veränderte Sourcecode:

    <%@ Page Language = "VB" %>
    <%@ Import Namespace="System.Data" %>
    <html>
	<script language="VB" runat="server">
 
      Function CreateDataSource() As ICollection

         Dim dt As New DataTable()
         Dim dr As DataRow
        
         dt.Columns.Add(New DataColumn("StringValue", GetType(String)))
        
         Dim i As Integer

         For i = 0 To 9
            dr = dt.NewRow()
            dr(0) = "Item " & i.ToString()
            dt.Rows.Add(dr)
         Next i
          
         Dim dv As New DataView(dt)
         Return dv

      End Function 'CreateDataSource

      Sub Page_Load(sender As Object, e As EventArgs)

         If Not IsPostBack Then
            DataList1.DataSource = CreateDataSource()
            DataList1.DataBind()
         End If

      End Sub 'Page_Load


      Sub Button1_Click(sender As Object, e As EventArgs)
        
         If DropDown1.SelectedIndex = 0 Then
            DataList1.RepeatDirection = RepeatDirection.Horizontal
         Else
            DataList1.RepeatDirection = RepeatDirection.Vertical
         End If 

         If DropDown2.SelectedIndex = 0 Then
            DataList1.RepeatLayout = RepeatLayout.Table
         Else
            DataList1.RepeatLayout = RepeatLayout.Flow
         End If 

         DataList1.RepeatColumns = DropDown3.SelectedIndex + 1
        
         If Check1.Checked = True And DataList1.RepeatLayout = RepeatLayout.Table Then
            DataList1.BorderWidth = Unit.Pixel(1)
            DataList1.GridLines = GridLines.Both
         Else
            DataList1.BorderWidth = Unit.Pixel(0)
            DataList1.GridLines = GridLines.None
         End If

      End Sub 
 
    </script>
	<body>
	<form runat="server">
	<h3>
	<font face="Verdana">DataList Beispiel</font>
	</h3>
	<asp:DataList id="DataList1" runat="server" BorderColor="black" 
		CellPadding="3" Font-Name="Verdana" Font-Size="8pt">
		<HeaderStyle BackColor="#aaaadd"></HeaderStyle>
		<AlternatingItemStyle BackColor="Gainsboro"></AlternatingItemStyle>
		<HeaderTemplate>
			Items
		</HeaderTemplate>
		<ItemTemplate>
			<%# DataBinder.Eval(Container.DataItem, "StringValue") %>
			</ItemTemplate>
		</asp:DataList>
		<p>
			<hr noshade align="left" width="300px">
			RepeatDirection:
			<asp:DropDownList id="DropDown1" runat="server">
			<asp:ListItem>Horizontal</asp:ListItem>
			<asp:ListItem>Vertical</asp:ListItem>
			</asp:DropDownList>
		<br>
			RepeatLayout:
			<asp:DropDownList id="DropDown2" runat="server">
			<asp:ListItem>Table</asp:ListItem>
			<asp:ListItem>Flow</asp:ListItem>
	 		</asp:DropDownList>
		<br>
			RepeatColumns:
			<asp:DropDownList id="DropDown3" runat="server">
			<asp:ListItem>1</asp:ListItem>
			<asp:ListItem>2</asp:ListItem>
			<asp:ListItem>3</asp:ListItem>
			<asp:ListItem>4</asp:ListItem>
			<asp:ListItem>5</asp:ListItem>
			</asp:DropDownList>
		<br>
			Show Borders:
			<asp:CheckBox id="Check1" runat="server" />
		</p>
		<p>
			<asp:LinkButton id="Button1" Text="Refresh DataList"
			OnClick="Button1_Click" runat="server" />
			</p>
		</form>
	</body>
    </html>
	

Und hier die dazugehörige Browserausgabe:

Data List-Darstellung mit verschiedenen Optionen

3.3.8 Validation Controls

Das leidige Problem der Formularfeld-Prüfung! Unzählige Stunden wurden damit verbracht, Formularwerte auf ihre Gültigkeit hin zu prüfen, sei es in technischer oder in logischer Hinsicht. Meist funktionierte es mit Javascript, mehr recht als schlecht, doch dann gab es wieder fünf von Hundert, die entweder ein Uraltmodell von Browser verwendeten oder gleich das Scripting komplett abgeschaltet hatten. Der Grossteil dieser Probleme gehört mit den Validation Controls zur Vergangenheit:

RequiredFieldValidator - prüft, ob ein Wert eingegeben wurde,
CompareValidator - vergleicht Werte auf Übereinstimmung (z.Bsp. in einem anderen Feld),
RangeValidator - überprüft, ob ein Wert in einem bestimmten Bereich liegt,
RegularExpressionValidator - prüft anhand eines angegebenen regulären Ausdrucks, ob dieser enthalten ist,
CustomValidator - kann den Wert in eine Funktion übergeben, die individuell anpassbar ist,
ValidationSummary - Zusammenfassung und Ausgabe aller Fehlermeldungen.

Zu diesen Validation Controls gehören dann noch die entsprechenden Attribute, nämlich die Base Validation Control- und die Base Compare Validation Control Properties. Im folgenden Quelltext verwenden wir vier dieser Validation Controls und sind im Grunde unseres Herzens begeistert über die Simplizität künftiger "Formularprüfungs-Programmierungen":

<%@ Page Language="VB"%>
<html>
<head>
</head>
<body>
<h3>
<font face="Verdana">Beispiel zur Formularprüfung</font>
</h3>
<p>
 
</p>
<form runat="server">
	<table cellpadding="10">
	<tr>
	<td>
		<table bgcolor="#ccffff" cellpadding="10">
		<tr>
		<td colspan="3">
		<font face="Verdana" size="2"><b>Ihre Kundendaten</b></font>
		</td>
		</tr>
		<tr>
		<td align="right">
		<font face="Verdana" size="2">Ihr Name:</font>
		</td>
		<td>
		<asp:TextBox ID="TextBox1" Runat="server" BorderColor="#ff0000" MaxLength="30" />
		</td>
		<td align="middle" rowspan="1">
		<asp:RegularExpressionValidator ID="RegularExpressionValidator1" 
ControlToValidate="TextBox1" Runat="server"
ErrorMessage="Hier sind keine Zahlen erlaubt!" ValidationExpression="\0-9"
Display="Dynamic" Width="100%"> * </asp:RegularExpressionValidator> </td> </tr> <tr> <td align="right"> <font face="Verdana" size="2">Ihre Kundennummer:</font> </td> <td align="right"> <asp:TextBox ID="TextBox2" Runat="server" BorderColor="#ff0000" /> </td> <td align="middle" rowspan="1"> <asp:RangeValidator ID="RangeValidator1" Runat="server"
ControlToValidate="TextBox2" Type="Integer"
MinimumValue="1" MaximumValue="99999" ErrorMessage="
Fehler: Kundennummer > 99999" Display="Dynamic"> * </asp:RangeValidator> </td> </tr> <tr> <td colspan="3"> <font face="Verdana" size="2"><b>Kreditkarten-Angaben</b></font> </td> </tr> <tr> <td align="right"> <font face="Verdana" size="2">Kartengesellschaft:</font> </td> <td> <asp:RadioButtonList id="RadioButtonList1" RepeatLayout="Flow" runat="server"> <asp:ListItem> MasterCard</asp:ListItem> <asp:ListItem> Visa</asp:ListItem> <asp:ListItem> American Express</asp:ListItem> </asp:RadioButtonList> </td> <td align="middle" rowspan="1"> <asp:RequiredFieldValidator id="RequiredFieldValidator1"
ControlToValidate="RadioButtonList1"
ErrorMessage="Kartengesellschaft fehlt "
Display="Static" InitialValue=""
Width="100%" runat="server"> * </asp:RequiredFieldValidator> </td> </tr> <tr> <td align="right"> <font face="Verdana" size="2">Kartennummer:</font> </td> <td> <asp:TextBox id="TextBox3" runat="server" /> </td> <td> <asp:RequiredFieldValidator id="RequiredFieldValidator2" ControlToValidate="TextBox3"
ErrorMessage="Kartennummer fehlt " Display="Static" Width="100%" runat="server"> * </asp:RequiredFieldValidator> </td> </tr> <tr> <td> </td> <td> <asp:Button id="Button1" text="Validate" runat="server" /> </td> <td> </td> </tr> </table> </td> <td valign="top"> <table cellpadding="20"> <tr> <td> <asp:ValidationSummary id="valSum" DisplayMode="BulletList" runat="server"
HeaderText="Sie müssen einen korrekten Wert
in folgenden Feldern eingeben:" Font-Name="verdana" Font-Size="12" /> </td> </tr> </table> </td> </tr> </table> </form> </body> </html>

Hier wieder unser Screenshot von unserem Formular. Mehrere Falscheingaben wurden "produziert":

Screenshot vom validierten Formular

3.3.9 User Controls

Ein besonderes Element, um spezifisch individuelle Controls zu gestalten, stellen die User Controls dar. Diese ermöglich es, ein Control zu definieren und dieses immer wieder in verschiedenste ASP-Seiten einzubinden. Sie werden gewissermaßen - um im bisherigen vertrauten ASP-Jargon zu bleiben, inkludiert.

Ähnlich einem Include-File werden User-Controls in die .aspx-Seite eingebunden. Selber tragen sie die Endung .ascx. User Controls erhalten einen eigenen, separierten Namespace und können daher nicht mit in der .aspx-Seite definierten Namenskonventionen von Variablen in Konflikt geraten.

Im Unterschied zur bisherigen Sprachenregelung, die besagt, dass im Gegensatz zum ASP 3.0, in einer ASP-Seite nur eine Sprache verwendet werden kann, also zum Beispiel nur Visual Basic, aber nicht VB mit JScript gemischt, können die inkludierten User Controls auch in einer anderen Sprache geschrieben sein. Weiters können sie auch Parameter enthalten, die in der .aspx-Seite durch Attribute gesetzt werden.

Wir erstellen also zunächst ein solches User Control, welches wir als "Laender.ascx"-File abspeichern, um es dann in obigem Formular-Prüfungsbeispiel einzubinden. Das User Control soll dem User ein Select-Feld zur Verfügung stellen, indem er seine Region auswählen kann. Hier der Quellcode des "Laender.ascx"-User Controls, er besteht aus einfachem HTML, ohne dass dies explizit angegeben wird, also kein <html></html>:

	
	<select size="1" name="laender">
	<option></option>
	<option>Wien</option>
	<option>Niederösterreich</option>
	<option>Burgenland</option>
	<option>Steiermark</option>
	<option>Oberösterreich</option>
	<option>Salzburg</option>
	<option>Kärnten</option>
	<option>Tirol</option>
	<option>Vorarlberg</option>
	</select>
	

Diese simplen 12 Zeilen Code werden also als "laender.ascx"-File abgespeichert. Jetzt müssen wir das File noch in unser obiges Beispiel einbinden und natürlich auch Platz in der Tabelle für das neue Feld schaffen. Eingebunden wird die Datei bereits in der zweiten Zeile unserer "Validation.aspx", erste und dritte Zeile wurden der besseren Übersicht wegen nochmals hier mitgenommen:

    
    <%@ Page Language="VB"%>
	<%@ Register TagPrefix="Eigenname" TagName="laender" Src="laender.ascx" %>
	<html>
    

Wir haben jetzt also unseren eigenen Namensraum "Eigenname" mit dem Attribut "laender". Danach wird noch der Pfad zur entsprechenden Datei angegeben. Jetzt bleibt uns noch die passende Tabellenzeile einzufügen, und zwar werden wir diese österreichische Bundesländerauswahl nach der Angabe der Kundennummer einfügen, daher geben wir hier nur mehr die zu ergänzenden Code-Zeilen wieder:

    
    <tr>
		<td align="right">
			<font face="Verdana" size="2">Ihr Bundesland:</font>
		</td>
		<td align="right">
			<Eigenname:laender id="laender1" runat="server" />
		</td>
		<td>
		 
		</td>
	</tr>
    

Dies liefert uns die nachfolgende Browserausgabe. Das wirklich Schöne an diesen User Controls ist einfach, dass zum Beispiel obige Select-Box ohne Änderung in vielen verschiedenen Web-Projekten wieder und immer wieder eingebaut werden kann. Wer etwa schon einmal in einem Shop eine derartige Länderliste zusammengebastelt hat, wird über diese Möglichkeit sicherlich dankbar sein.

Eingefügtes UserControl in das Formular-Validierungs-Beispiel

3.3.10 Fazit

Wir konnten mit diesem Artikel leider nur einen groben, verkürzten Umriss der Möglichkeiten sämtlicher Controls liefern. Diese Artikelreihe wird in den nächsten Ausgaben fortgesetzt mit folgenden Themen:

In der nächsten Ausgabe von querdenker:

Mit Code-Behind programmieren
ASP.NET Web Services und Configuration
ADO.NET
und vieles mehr ...ab Januar 2002 - möglicherweise bereits mit der Final Release von .NET

MS.NET doch Unix-kompatibel -
Mainsoft bringt Portierungs-Tool


Was bisher nur als Gerücht in der weiten Welt herumgetragen wurde, scheint sich jetzt doch zu bestätigen: "Visual MainWin for .NET" von Mainsoft soll als Portierungs-Tool in der Lage sein, unter .NET entwickelte C++-Anwendungen auf UNIX zu portieren.

Dabei werden laut Hersteller auch die meisten Derivate unterstützt, wie etwa Solaris, HP-UX, AIX und Red Hat Linux. XML-Fähigkeit ist dabei eine Selbstverständlichkeit. Man greift bei der Portierung nicht auf einen langsamen Emulator zurück, sondern kompiliert neu. Vom zeitlichen Rahmen her soll Visual MainWin zeitgleich mit der Public Release von VS.NET erscheinen, also noch in diesem Quartal.

Visual MainWin SDK ist eine Cross-Plattform-taugliche Entwicklungsumgebung, die sich durch ein Add-On in VS.NET integriert. So ist es nun möglich, durch einen einfachen Maus-Klick in einem Drop-Down-Menü statt der Win32- Kompilierung verschiedene Unix-Builds auszuwählen. Der zweite Teil des Tools besteht aus der Windows-Plattform für Unix. Dabei werden dieselben APIs benutzt wie unter Windows. Dadurch sollen .NET Applikationen unter Unix genauso laufen wie unter Windows. Detail am Rande: Eine integrierte Java-COM-Bridge ermöglicht es, COM-Komponenten direkt aus Java anzusprechen.

Hammer 1

Meine Meinung -
1 Schritt nach vor,
fünf zurück...

Vorläufiges Fazit einer langen Reihe von Tests mit der Beta2 Version des Visual Studio .NET: Beeindruckend, trotz einer Reihe von Totalabstürzen. Wir denken, dass Microsofts .NET zwar keine Revolution auslösen, aber einen neuen Standard der Programmierung mit sich bringen wird. Das Konzept dahinter ist mit Sicherheit evolutionär, wenn auch Microsoft in manchen Bereichen, wie etwa bei Visual Basic, um altgestandene VB-Programmierer nicht zu vergrämen, kräftig zurück gerudert hat. Für unseren Geschmack etwas zu viel. Dennoch bleibt ein guter bis sehr guter Eindruck des kommenden, neuen Produktes. Ein Schritt in die richtige Richtung.

Hammer 2

Ganz und gar kein Schritt in die richtige Richtung, sondern ganz umgekehrt in die falsche Richtung, dagegen von Microsoft auf anderen Ebenen. Mittlerweile schäumt einem hier eine unverschämte Aggressivität entgegen, gepaart mit der Arroganz des Glaubens, sich im alleinigen Recht zu befinden. Da werden schon mal heimlich mit dem Servicepack 2 sämtliche Netscape-Plugins entfernt, müssen die doofen User halt auf Active-X-Plugins wechseln (Es ist nicht zu erwarten, dass jemals deren gravierende Sicherheitslücken behoben werden). Da kann es schon passieren, dass in einer EULA, Linux mit viraler Software gleichgesetzt wird. Und dies obwohl oder gerade deswegen, weil Microsoft mit erstaunlicher zeitlicher Regelmäßigkeit Betriebssysteme fabriziert, die diesen Namen nicht verdienen. Siehe das unsägliche WindowsMe (der ungekrönte Absturzkaiser) oder das grafisch aufgemotzte Kindergarten-Pseudo-Betriebssystem WindowsXP. Dieses Zwischenfabrikat WinXP wird dann spätestens 1 1/2 Jahre später gegen Windows .NET ausgetauscht. Wer da noch mitmacht?

So nebenbei kommt man dann kaum mehr nach mit dem Einspielen der Patches und Bugfixes. Dies schaffen ja nicht einmal die Mannen aus Redmond. Letztes Beispiel: Wer sich auf den Microsoft- FrontPage-Seiten um den 18.9. herumgetrieben hat, konnte gleich noch in den Besitz von Nimda kommen, weil sich dessen Javascript- Aufruf auf Billys-Seiten eingenistet hatten. Ja, der Patch gegen manche Vulnerable-Lücken des IIS war schon alt, aber MS selber hat ihn nicht eingespielt. Abgesehen vom ständigen Risiko, sich mit jedem neuen Patch der Gefahr auszusetzen, dass ein holprig funktionierendes System eben gar nicht mehr funktioniert.

Da werden schon mal Sachen eingeführt, die gut gemeint sind (für die Naiven) wie die Smart Tags. Das wird halt dann so eingebaut, dass es ein Schuss in den Ofen ist. Quasi mit umgekehrter "Beweislast": Nicht wer SmartTags einsetzen will, modifiziert seine Seiten, nein, alle anderen (also das gesamte Netz) muss seine Seiten ändern, wenn man keine Smart Tags dulden möchte! Spätestens hier wäre es dann angebracht, die Rechnung vom Webdesigner/Programmierer nach Redmond zu schicken. Oder der begrüssenswerte Einbau der vom W3C wohlüberlegten P3P-Policy, die in der Umsetzung des IE 6 dazu führt, dass defaultmäßig bei jeder Seite, die einen lächerlichen Cookie setzt, ein gelbes Rufzeichen in der Statuszeile erscheint. Soweit, sogut. Aber: Die Erlangung einer Security Policy für die eigenen Seiten ist nur mit einer umständlichst auszuführenden Registrierrungsroutine auf den Seiten von Microsoft selber möglich. Aber: Das da natürlich wieder ein Haufen Daten abgefragt werden ist eh klar. Nebenbei ist das auch noch schlampig programmiert, da kann halt mal schon das Feld für die eigene Telefonnummer um ein paar Stellen zu klein sein. Zum Haareraufen!

Zum Glück gibt´s dann noch Server, wie den SQL-2000-Datenbankserver von Microsoft, der recht zuverlässig und flott seine Dienste verrichtet. Ansonsten wäre es zum Verzweifeln, selbst der Loyalste wird auf eine Geduldsprobe gestellt, die bereits an Masochismus erinnert. Es wäre hoch an der Zeit, dass Microsoft seine Produktpolitik und sein Gehaben nicht mehr der Gewinnmaximierung unterwirft, sondern der Optimierung. Auch IBM hat es geschafft sich selber vom Thron zu stossen. Wer sagt denn, dass die Nummer 1 immer die Nummer 1 bleibt...?

Details am Rande: Mit Oktober wird in Österreich eines der vernünftigsten Produkte von Microsoft, die MSDN-Palette, preislich kräftig angehoben. Da kann man dann die treuesten der Treuen wieder kräftig abzocken. Nach all diesen - was den eigentlich? - Mißverständnissen möchte man sich dann entspannen, vielleicht mit einem Spiel? Ah ja, die Games von Microsoft. Der "wunderbare" Train Simulator funktioniert auch nicht - auf ungefähr 5 von 10 Maschinen. Grafik- und Soundkartenprobleme ...Wozu testen?... die kaufen´s ja doch ...

Martin Kratschmer

Hammer 3

see-programming

Home
Programmierung
Philosophie
Referenzen und Projekte
Kontakt
Newsletter

querdenker

Frühere Ausgaben

Impressionen - aus den Tiefen des Netzes

Impressum
Haftungsausschluss
Linie horizontal