Archive for the 'ASP.NET' Category
April 1st, 2009 by Kai Gloth
Formulare sind etwas ganz Grundsätzliches jeder Web-Anwendung. Zu jedem guten Formular gehören Hilfe und Erklärungstexte, damit der Benutzer ganau weiß was er einzugeben hat. Meiner Auffassung nach sollte die Aufklärung im Vorfeld durchgeführt werden und nicht erst durch die Ausgabe einer entsprechenden Fehlermeldung - jedoch wäre ein langer Erklärungstext für jedes Feld zu umfangreich, und würde eher abschreckend wirken.
Die Lösung sind also ToolTips, die nach belieben des Benutzers eingeblendet werden. Häufig werden die Hilfetexte nicht vom Entwickler, sondern von anderen Kräften erstellt. Somit sollten die Hilfetexte leicht einzugeben ein und ohne Problem verändert werden können.
Die Verarbeitung und Anzeige der ToolTips überlasse ich der jQuery JavaScript Library mit der Abwandlung jTip, was bedeutet das diese Referenzen zunächst eingebunden werden müssen. Wichtig ist hierbei die Reihenfolge, die strikt eingehalten werden muss. Weiterhin gibt es eine CSS Datei, die sich um die nötigen Formatierungen kümmert.
<head runat="server">
<link href="Stylesheet1.css" rel="stylesheet" type="text/css" />
<script src="jquery.js" type="text/javascript"></script>
<script src="jtip.js" type="text/javascript">
</script>
<title></title>
</head>
Die Hilfetexte selbst werden über einen generischen HttpHandler eingebunden, welcher wiederum den Zugriff auf eine globale Resource-Datei nutzt. Die Unterscheidung der Texte erfolgt über die Angabe eines Schlüssels, welcher in der gleichen Form in der Resource-Datei zu finden ist.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
namespace FormularToolTip
{
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class HelpHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
string key = context.Request.QueryString["key"];
context.Response.Write(String.Format("<p>{0}</p>",
HttpContext.GetGlobalResourceObject("Help", key)));
}
public bool IsReusable
{
get
{
return false;
}
}
}
}
Damit der jQuery Code die Arbeit aufnehmen kann, ist es nötig den Link zur Hilfe mit einer entsprechenden Klasse zu versehen. Über das Attribut Name, wird die Überschrift abgegeben.
Benutzername: <asp:textbox ID="Textbox1" runat="server"></asp:textbox>
<a href="HelpHandler.ashx?key=Help1" name="Benutzername" id="Help1" class="jTip">?</a>
Dieser Beispielcode zeigt den Link als Fragezeichen. Zusätzlich wird der Mauszeiger mit Hilfe der CSS Datei verändert, sobald er sich über dem Fragezeichen befindet, allerdings nur sofern der Browser dies unterstützt.
Das Ergebnis ist die Anzeige eines einfachen ToolTips, welcher dazu noch leicht einzugeben und zu warten ist. Leider ist auf dem Screenshot der Mauszeiger nicht zu sehen.
Das Beispielprojekt gibt es hier zum Download.
February 1st, 2009 by Kai Gloth
Die Verwendung von Tracing ist eine einfache und leichte Möglichkeit einem Fehler auf den Grund zu gehen oder einfach nur bestimmte Ereignisse und Vorgänge per Nachricht auszugeben. In der Code-Beside Datei einer ASP.NET Seite ist dies, je nach verwendeter Programmiersprache, einfach. Wird C# verwendet kann über die Klasse Trace und die Methode Write eine Nachricht ausgegeben werden.
In vielen Web Anwendungen wird jedoch JavaScript, häufig in Verbindung mit AJAX genutzt. Das ASP.NET AJAX Framework bietet allerdings auch eine Möglichkeit an Tracing zu verwenden.
Über die Funktion Sys.Debug.trace() kann eine einfache Meldung ausgegeben werden.
<script language="javascript" type="text/javascript">
function TraceMessage()
{
Sys.Debug.trace("Tracing is working");
}
</script>
Ist das Script-Debugging im Internet Explorer aktiviert und die Anwendung per Visual Studio ausgeführt, wird die Meldung im Visual Studio Output Window ausgegeben.
Eine weitere Möglich besteht in der Ausgabe in eine Textarea. Hier muss auf der Seite eine Textarea mit der ID TraceConsole eingefügt werden. Anschließend werden die Meldungen auch hier ausgegeben.
<textarea id="TraceConsole" cols="20" rows="20"></textarea>
Wird kann der Firefox Browser verwendet, können die Meldungen mit Hilfe des FireBug Add-Ons ebenfalls ausgegeben werden. Hierzu ist es nötig die Konsole für den localhost zu aktivieren.
Dem dem sehr einfachen Ausgeben von Nachrichten bietet das AJAX Framework noch weit umfangreichere Möglichkeiten, um Fehler zu finden, oder das Verhalten der Anwendung zu beobachten. In der MSDN finden sich dazu mehrere Artikel und Beschreibungen:
Debugging and Tracing AJAX Applications Overview
Die Beispielanwendung kann hier runtergeladen werden.
January 14th, 2009 by Kai Gloth
Ein häufiges Ärgernis von AJAX Anwendungen tritt dann zu Tage, wenn die Vor- und Zurück-Buttons des Browsers verwendet werden. Eine per AJAX ausgeführte Aktion wird vom Browser nicht als Seitenwechsel interpretiert und taucht somit auch nicht im Seitenverlauf auf. Im schlimmsten Fall landet der Benutzer der Seite also wieder am Beginn und hat alle getätigten Änderungen und Eingaben sind verloren.
Mit dem Service Pack 1 des .NET Framework 3.5 wurde der AJAX ScriptManager um eine neue Funktionalität erweitert. Diese neue Funktion setzt nach jedem AJAX Aufruf einen Verlaufspunkt im Browser, so dass die Vor- und Zurück-Buttons wieder verwendet werden können. Das folgende Beispiel zeigt die Verwendung anhand einer DropDownListe und eines UpdatePanels auf. Nach dem Auswählen eines Eintrags wird der Bereich im UpdatePanel aktualisiert und die Auswahl in einem Label ausgegeben.
<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<asp:UpdatePanel ID="updatePnl" runat="server">
<ContentTemplate>
<asp:DropDownList ID="ddlAuswahl" runat="server" OnSelectedIndexChanged="ddlAuswahl_SelectedIndexChanged" AutoPostBack="true">
<asp:ListItem>Eintrag 1</asp:ListItem>
<asp:ListItem>Eintrag 2</asp:ListItem>
<asp:ListItem>Eintrag 3</asp:ListItem>
<asp:ListItem>Eintrag 4</asp:ListItem>
<asp:ListItem>Eintrag 5</asp:ListItem>
</asp:DropDownList>
<br />
Auswahl: <asp:Label ID="lblAuswahl" runat="server" />
</ContentTemplate>
</asp:UpdatePanel>
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void ddlAuswahl_SelectedIndexChanged(object sender, EventArgs e)
{
lblAuswahl.Text = ddlAuswahl.Text;
}
}
Ohne die AJAX Funktionalität, die das UpdatePanel bereitstellt, wird nach jeder Auswahl die Seite neu geladen und somit auch der Zurück-Button im Browser aktiv. Sobald jedoch das UpdatePanel verwendet wird, bleibt der Button ausgegraut.
Neben dem setzen der Eigenschaft EnableHistory des ScriptManagers auf true, ist es weiterhin nötig einen HistoryPoint zu setzen. Dies wird im EventHandler der DropDownListe erledigt.
protected void ddl_SelectedIndexChanged(object sender, EventArgs e)
{
ScriptManager1.AddHistoryPoint("index", ddl.SelectedIndex.ToString(), "Point " + ddl.SelectedValue);
}
Um die gesetzten Werte später wieder abzurufen und - in diesem Beispiel - den richtigen Index der DropDownListe zu setzen, ist es nötig den Event OnNavigate des ScriptManagers zu abonnieren. An den EventHandler wird der Wert übergeben, welcher vorher mit Hilfe der Methode AddHistoryPoint gesetzt wurde.
protected void ScriptManager1_Navigate(object sender, HistoryEventArgs e)
{
string selectedIndex = e.State["index"];
if (String.IsNullOrEmpty(selectedIndex))
ddl.SelectedIndex = 0;
else
ddl.SelectedIndex = Convert.ToInt32(selectedIndex);
}
Nach dem Starten der Anwendung ist das Ergebnis ein aktiviertes Zurück-Button im Browser.
Durch die flexible Struktur und die Events ist es möglich das Verhalten in komplexen AJAX-Anwendungen an die eigenen Bedürfnisse anzupassen.
Noch ein Hinweis:
Wird die Eigenschaft EnableHistory auf false gesetzt, ohne den Aufruf der Methode AddHistoryPoint() zu entfernen, wird der Aufruf mit einer Exception quittiert. Um dies zu verhindern kann die Eigenschaft zusätzlich noch im EventHandler abgefragt werden. Weiterhin gibt die Eigenschaft IsNavigating Auskunft darüber, ob momentan mit Hilfe des HistoryControls navigiert wird.
protected void ddl_SelectedIndexChanged(object sender, EventArgs e)
{
if (ScriptManager1.EnableHistory && ScriptManager1.IsNavigating == false)
{
ScriptManager1.AddHistoryPoint("index", ddl.SelectedIndex.ToString(), "Point " + ddl.SelectedValue);
}
}
Das Beispielprojekt kann hier herruntergeladen werden.
October 26th, 2008 by Kai Gloth
Schon in mehreren Beiträgen habe ich auf die Visual Studio Shortcuts und die damit verbundene Erleichterung beim Entwickeln von Code hingewiesen. In letzter Zeit habe ich mich jedoch häufiger mit ASP.NET Entwicklern unterhalten, denen die Funktion hinter der Taste F7 gänzlich unbekannt ist. Ich selbst empfinde diese Taste und die damit verbundene Funktion jedoch als ungemein wichtig.
Jeder ASP.NET Entwickler kennt seit Version 1.0 die mit einer ASP.NET Seite verbundene Code Datei. Früher wurden sie noch Code-Behind gennant, während sie heute Code-Beside heißt.
Wird in der ASP.NET Seite (genannt dem Html Markup) ein Control platziert, welches in irgendeiner Weise mit Funktionalität angesprochen werden soll, muss der Entwickler in die Code-Beside Datei wechseln. Hierfür klickt der Entwickler mit der Maus im Solution Explorer auf die zugehörige Datei. Hier liegt jedoch genau der Umstand: Es muss die Maus benutzt werden. Die Taste F7 ermöglicht das direkte springen in die Code Datei und erlaubt somit die Implementierung ohne die Hände von der Tastatur nehmen zu müssen.
Leider ist es mir bis heute nicht gelungen den umgekehrten Weg zu gehen: Von der Code-Beside Datei in das Html-Markup. Der Shortcut Shift + F7 öffnet den Html Designer, welcher aber in diesem Fall fehl am Platz ist.
October 20th, 2008 by Kai Gloth
Bereits am 15.10. wurde die siebte Version des BlogBooks veröffentlicht.
In dieser Ausgabe stecken einige Neuerungen:
- Es gibt kein einzelnes PDF mehr. Die einzelnen Teilbereiche wurden in verschiedene Dateien verpackt. So kann man zwischen den Bereichen wählen - Mit der Ergebnis das Downloadgröße und Zeit minimiert werden.
- Alles wurde in ein neues Layout verpackt. Damit wird sichergestellt, dass die Lesbarkeit nun besser gegeben ist und auch die Ergebnisse beim Druck positiver ausfallen.
- Neue Beiträge wurden hinzugefügt.
Im ersten Schritt steht nur der Bereich Windows Presentation zur Verfügung. Alle weiteren Bereiche werden in den nächsten Tagen nachgeliefert.
Rückmeldungen und konstruktive Kritik sind mir und Norbert natürlich immer herzlich willkommen. Weitere Informationen und Download-Möglichkeiten finden sich auf der Projekt-Homepage unter http://www.dotnet-blogbook.com
September 28th, 2008 by Kai Gloth
Das Auslesen der Html-Ausgabe einer ASPX-Seite. Was zunächst ein wenig seltsam klingt wird doch häufiger benötigt, als im ersten Moment vermutet. Ein konkreter Anwendungsfall wäre z.B. das verschicken einer Html-Email. Der Body der Email besteht - wie der Name schon sagt - aus Html, welcher vorher generiert werden muss. Das Verschicken einer Bestellbestätigung in einem Onlineshop, welches eine Auflistung aller bestellten Artikel enthält ist ein häufiges Anwendungsbeispiel. Wichtig an dieser Stelle ist das keine neue Session durch das Einlesen entsteht und somit der bestellt Warenkorb aus anderer Quelle gelesen werden muss.
Um dieses Problem zu umgehen bietet sich die Methode Server.Execute() an. Mit Hilfe des StreamWriter Objekts kann die Ausgabe umgeleitet und direkt in einem String gespeichert werden. Im Beispiel wird eine Seite mit dem Namen MailBody.aspx eingelesen, die die aktuelle Uhrzeit in ein Label schreibt.
protected void bttGetPageOutput_Click(object sender, EventArgs e)
{
string html = GetPageOutput("MailBody.aspx");
}
public string GetPageOutput(string file)
{
//Enthält später das Html
string output = String.Empty;
//Pfad kompletieren
file = Path.Combine(Request.ApplicationPath, file);
//Liest das Html ein
StringWriter sw = new StringWriter();
try
{
Server.Execute(file, sw);
output = sw.ToString();
}
catch (Exception ex)
{
//System.Diagnostics.Debug.Assert(false, ex.Message);
output = null;
}
return output;
}
Sicherlich gibt es noch andere Wege um die Ausgabe einzulesen. Die oben beschriebene ist jedoch sehr leicht umzusetzen und beinhaltet nur wenig Code.
Das Beispielprojekt findet sich unter der Url:
http://www.veloursnebel.de/Code/GetPageOutput.zip
September 7th, 2008 by Kai Gloth
Nach fünf Wochen Gewinnspiel und weit mehr als 400 Teilnehmern wurde es nun endlich Zeit die Gewinner zu ziehen. Zu gewinnen gab es zwei Tickets zur Xtopia und ein Microsoft Expression Studio 2. Ich möchte mich für die rege Teilnahme bedanken und das positive Feedback welches ich per Email erhalten habe.
Die Gewinner selbst wurden soeben per E-Mail benachrichtigt - Herzlichen Glückwunsch an dieser Stelle.
August 1st, 2008 by Kai Gloth

Im letzten Jahr fand zum ersten Mal die Xtopia Konferenz speziell für Technologien rund um das Web statt. Dieses Jahr geht die Xtopia in die zweite Runde mit noch stärkerem Fokus auf die Webthemen und hoher Relevanz für Business, Webentwicklung und -design. Die Besucher können zwei Tage lang aus vier parallelen Vortragsreihen - aufgeteilt in Business, Web-Technologien, Design und UX - wählen und erhalten somit brandneue Informationen und Wissen.
Vom 01.08.2008 bis zu 05.09.2008 gibt es deshalb die Möglichkeit zwei Tickets zur Xtopia und ein Microsoft Expression Studio zu gewinnen. Hierzu müssen nur die folgenden Fragen richtig beantwortet werden. Mehr Informationen zu den Fragen gibt es unter dem jeweiligen Hinweis-Link. Unter allen richtigen Einsendungen entscheidet das Los.
Bitte die Lösungen per Email an gewinnspiel@veloursnebel.de senden
1) Frage:
Wie heißt die neue Produkt-Familie professioneller Werkzeuge für Webdesigner, Interactive Designer und Entwickler von Rich Internet Applications?
a) Microsoft Expression Studio 2
b) MSDN
c) Visual Studio
d) .NET Framework
Hinweis: http://go.microsoft.com/?linkid=9286784
2) Frage:
Xtopia ist die Microsoft-Konferenz für Business, Web Technology, Design & ????
a) UX
b) Andere
c) Architects
d) Database-Engineers
Hinweis: http://go.microsoft.com/?linkid=9286785
3) Frage:
Bis wann läuft die Early-Bird-Promotion der Xtopia?
a) 19.09.2008
b) 10.09.2008
c) 19.10.2008
d) 24.12.2008
Hinweis: http://go.microsoft.com/?linkid=9286786
4) Frage:
Wie heißen die vier Tracks der Xtopia?
a) Business/Design/UX/Technology
b) Business/Design/UX/Developer
c) Business/Creative/UX/Technology
d) Marketing/Design/UX/Technology
Mehr Informationen zu Xtopia 2008 gibt es unter http://www.xtopia.de. Wichtig: Noch bis zum 19.09 kann unter Verwendung des günstigen Early-Bird-Tarif gebucht werden.
July 19th, 2008 by Kai Gloth
Das Repeater Control eignet sich hervorragend um Daten auf ASP.NET Seiten anzuzeigen. Eine häufige Anforderung ist die Nummerierung jedes einzelnen Datensatzes. Viele Lösungen verwenden den ItemDataBound Event um die Zeilennummer mit Hilfe einer Variablen hochzuzählen und anzuzeigen. Jedes Repeater-Element verfügt jedoch über die Eigenschaft ItemIndex, die den aktuellen null basierten Index enthält. Somit kann auf einfache Weise die Zeilennummer angezeigt werden.
<asp:Repeater ID="rep1" runat="server">
<ItemTemplate>
<%#(((RepeaterItem)Container).ItemIndex+1).ToString() %>
</ItemTemplate>
</asp:Repeater>
Problematisch ist diese Lösung, sobald die Datensätze über mehrere Seiten hinweg angezeigt werden sollen. In diesem Fall würde der Index auf jeder Seite erneut bei eins beginnen. Folgendes Beispiel verwendet die Klasse PagedDatasource um die Datensätze auf mehrere Seiten zu verteilen. Die Berechnung erfolgt nach dem Schema AnzahlProseite * AktuelleSeite + DatensatzIndex + 1. Zugegeben, die jetzt folgende Zeile ist sehr lang und auch auf den zweiten Blick nicht sehr eingängig, erfüllt jedoch ihren Zweck. Über die DataSource Eigenschaft des Repeater Controls, wird auf das PagedDataSource Objekt zugeriffen, welches die beiden fehlenden Werte bereit hält.
Das Ergebnis sind die korrekt nummerierten Werte, auch über mehrere Seiten hinweg.
<asp:Repeater ID="rep1" runat="server">
<ItemTemplate>
<%#(((PagedDataSource)((Repeater)((RepeaterItem)Container).Parent).DataSource).PageSize
* ((PagedDataSource)((Repeater)((RepeaterItem)Container).Parent).DataSource).CurrentPageIndex
+ (((RepeaterItem)Container).ItemIndex + 1)).ToString()%>
</ItemTemplate>
</asp:Repeater>
Das Beispielprojekt kann hier runtergeladen werden.
July 7th, 2008 by Kai Gloth
Diesen Hinweis erhielt ich in den letzten Tagen von einem Kollegen. Mit der ersten Vermutung, dass das Validation Control vielleicht in einer anderen ValidationGroup liegt, beschäftigte ich mich mit dem Problem. Die Seite beinhaltete jedoch nur eine ValidationGroup und auch ansonsten schien auf den ersten Blick alles korrekt definiert. Einige Kleinigkeit war jedoch nicht ganze korrekt, die noch dazu auf den ersten Blick nicht sofort erkennbar ist.
Die Eigenschaft Text des - in diesem Fall verwendeten - RequiredFieldValidator Controls wird zwar als Fehlermeldung angezeigt, jedoch nur wenn die Eigenschaft Display mit dem Werten static oder dynmic belegt ist. Wird ein ValidationSummary Control in Verbindung mit Display=None verwendet, bleibt der Text verborgen. In diesem Fall muss zwingend die Eigenschaft ErrorText verwendet werden. Die Eigenschaft ErrorText ist also in jedem Fall “richtiger”.
Natürlich ist die Eigenschaft Text nicht obsolet. Ein denkbares Beispiel wäre z.B. eine zusätzlich Kennzeichnung des fehlerhaften Feldes mit einem Sternchen.