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>

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

2 - nach Absenden mit angekreuzter Checkbox

3 - nach Absenden ohne Checkbox anzukreuzen

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:

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:
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:
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":
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.
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
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.
|
 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.
 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
see-programming
Home
Programmierung
Philosophie
Referenzen und Projekte
Kontakt
Newsletter
querdenker
Frühere Ausgaben
Impressionen - aus den Tiefen des Netzes
Impressum
Haftungsausschluss
|