Personalisierung mit ASP.NET 2.0

Veröffentlicht: 12. Sep 2004 | Aktualisiert: 14. Nov 2004

Von , , und

Erstellen Sie personalisierte Anwendungen in kürzerer Zeit sowie völlig neue Klassen von Anwendungen mit den neuen Personalisierungsfunktionen in ASP.NET 2.0. Dieser Artikel enthält auch Links zu englischsprachigen Seiten.

Auf dieser Seite

 Einführung
 Identifizieren und Verwalten von Benutzern
 Erstellen eines personalisierten Benutzererlebnisses
 Ein einfacher Webpart
 Ein abgeleiteter Webpart
 Implementieren von Schnittstellen
 Speichern von Benutzerdaten mit Anbietern
 Benutzerdefinierte Mitgliedschaftsanbieter
 Benutzerdefinierte Profilanbieter
 Benutzerdefinierte Personalisierungsanbieter
 Schlussfolgerung

Einführung

Das Spektrum der Geschäftsanwendungen, die heutzutage mithilfe webbasierter Anwendungen bedient werden können, wird immer breiter. Mit ihrer erweiterten Funktionalität und höheren Bandbreite unterstützt die Infrastruktur des Internets nun eine wachsende Zahl und zusätzliche Typen von Benutzern. Diese Benutzer greifen aus verschiedenen Gründen über viele unterschiedliche Geräte auf das Internet zu. Dadurch ist die traditionelle Webarchitektur für "anonyme" Einzelbenutzer unzureichend.

Um mit den neuen Anforderungen nach flexibleren, benutzerorientierten Webanwendungen Schritt zu halten, enthält Microsoft ASP.NET 2.0 ein umfassendes Personalisierungs-Framework. Die Personalisierungs-Features von ASP.NET 2.0 bieten neue Mechanismen zur Identifizierung und Registrierung von Benutzern, zur Anpassung einer Website an bestimmte Benutzer und zur automatischen und transparenten Speicherung von Benutzerinformationen. Webparts ermöglichen Benutzern die Einbeziehung von Informationen, die sie als besonders wertvoll erachten. Mithilfe der Layoutsteuerung und der Einbeziehung relevanter Tools können Benutzer eine Site erstellen, die an ihren Erfahrungsstand angepasst ist. Diese Benutzeranpassungen können für nachfolgende Besuche der Site benutzerabhängig gespeichert und dann dementsprechend zur Verfügung gestellt werden.

Dieses Whitepaper bietet einen technischen Überblick über die neuen Funktionen, einschließlich Webparts, Authentifizierungssteuerungen und Personalisierungsanbietern. Die Codebeispiele und Funktionsbeschreibungen in diesem Whitepaper richten sich sowohl an Anfänger als auch fortgeschrittene Programmierer oder solche, die sich einfach nur für die neuen Personalisierungsfeatures von ASP.NET 2.0 interessieren.

Der Personalisierungsprozess

Die traditionelle Funktion von Websites bestand darin, Informationen an interessierte Benutzer zu vermitteln. Dabei enthielt eine bestimmte Site entsprechende Informationen über ein Konzept oder Produkt und bot zusätzlich Links zu anderen relevanten Informationsquellen. Moderne Websites besitzen ein weitaus breiteres Funktionsspektrum und lassen sich viel zutreffender mit den Begriffen "Portal" oder "zentraler Informationspunkt" beschreiben. Und es sind genau diese Art von Sites, bei denen Personalisierungs-Features wie Webparts und der Profildienst genutzt werden können, um Betrachtern ein konfigurierbares und bedeutsames Weberlebnis zu ermöglichen. Mit zunehmender Größe und Komplexität von Unternehmen wächst auch die Notwendigkeit, Informationen auf kontrollierte und sichere Art und Weise zu vermitteln. Damit eine Website Personalisierung ermöglichen kann, muss die Webanwendung eine Reihe ganz bestimmter Tasks ausführen:

  • Identifizieren des Benutzers: Eine Webanwendung muss über einen Mechanismus verfügen, die Anforderungen eines Benutzers von denen eines anderen zu unterscheiden. Die Identifikation und Verknüpfung des Benutzers mit spezifischen Rollen umfasst drei klar abgegrenzte Prozesse: Erstens muss die Website über eine Methode verfügen, die es einem Benutzer ermöglicht, sich zu identifizieren (Authentifizierung), zweitens muss die Website eine Möglichkeit besitzen, die Anforderungen des Benutzers zu identifizieren (Sitzungskontinuität), und drittens muss die Website über einen Mechanismus zum Erstellen und Verwalten neuer Benutzeridentitäten verfügen.

  • Personalisierung: Die Personalisierung einer Website umfasst das Aktivieren oder Deaktivieren von Funktionen für bestimmte Benutzer (Autorisierung), das Bereitstellen einer benutzerdefinierten Anzeige für einen Benutzer bis hin zum Nachverfolgen von Benutzerinformationen (z. B. ein Warenkorb). Diese Tasks nutzen die Identität des Benutzers auf unterschiedliche Weise, um jedem Benutzer ein individuelles Weberlebnis zu ermöglichen.

  • Speichern von Benutzerinformationen: In den meisten Fällen muss eine Webanwendung Benutzerinformationen zwischen Anforderungen oder zwischen Sitzungen speichern. Benutzerinformationen können neben der Identität des Benutzers (Benutzername und Kennwort) auch komplexe Listen mit Einstellungen oder historische Daten (z. B. die "Wunschliste" bei Amazon) umfassen.

Eine der Herausforderungen bei der Entwicklung personalisierter Webanwendungen war der Entwurf des Frameworkcodes, der für die Unterstützung des Personalisierungsprozesses erforderlich ist. Neben der Entwicklung der einzelnen Funktionen musste sichergestellt werden, dass alle Funktionen sicher und nahtlos zusammenarbeiten.

ASP.NET 2.0 enthält eine Reihe neuer Steuerelemente und Technologien, die eine elegante Lösung für diese Problematiken bieten. Sollte die Standardfunktionalität keine Lösungen bieten, ermöglicht das Anbieterframework die Entwicklung benutzerdefinierter Lösungen, die nahtlos mit anderen Aspekten des Systems zusammenarbeiten.

Personalisierung in ASP.NET 2.0
ASP.NET 2.0 vereinfacht und verbessert die Personalisierung, indem es integrierte Steuerelemente und Funktionen bietet, die speziell auf die Phasen des Personalisierungs-Prozesses zugeschnitten sind. Aus der Perspektive von ASP.NET 2.0 sind das die drei Hauptbereiche Mitgliedschaft, Profile und Webparts. In diesem Whitepaper wird jeder dieser Bereiche eingehender untersucht.

Mitgliedschaft
ASP.NET 1.x bot Authentifizierungs- und Autorisierungsdienste, die sich auf externe Datenspeicher oder die Konfiguration in der Datei web.config stützten. So ermöglichte beispielsweise eine ASP.NET 1.1-Anwendung formularbasierte Authentifizierung, die voraussetzte, dass der Entwickler ein Anmeldeformular und die entsprechenden Steuerelemente erstellte, um Benutzeranmeldeinformationen zu erfassen, zu überprüfen und zu verwalten. Nach der Authentifizierung des Benutzers erfolgte die Autorisierung über XML-Konfigurationen in der Datei web.config.

ASP.NET 2.0 erweitert diesen Dienst auf drei unterschiedliche Arten:

  • Anmelde- und Benutzersteuerelemente: Die neue Sammlung mit Steuerelementen zur Anmeldung und Benutzerverwaltung macht es weitgehend überflüssig, dass Standardbenutzercode für jede Anwendung neu geschrieben werden muss. So können Sie beispielsweise eine Reihe von Seiten erstellen, die die Registrierung neuer Benutzer, die Anmeldung vorhandener Benutzer und sogar das Senden eines vergessenen Kennworts an einen Benutzer ermöglichen, indem Sie einfach die entsprechenden Steuerelemente auf der Seite platzieren und ein paar Eigenschaften einstellen.

  • Benutzerverwaltung: Auf jede ASP.NET 2.0-Anwendung kann über eine spezielle Gruppe administrativer Seiten zugegriffen werden. Dadurch kann ein autorisierter Benutzer neue Benutzer erstellen, Benutzer bestimmten Rollen zuordnen und Benutzerinformationen speichern. Wenn Sie Ihre eigenen Verwaltungstools erstellen möchten, können Sie auf dieselben Funktionen programmtechnisch zugreifen.

  • Mitgliedschaftsanbieter: Das neue Mitgliedschafts-Feature erstellt eine Verknüpfung zwischen den Front-End-Funktionen (Anmeldesteuerelemente und Benutzerverwaltungssite) und dem Persistenzmechanismus. Ein Mitgliedschaftsanbieter kapselt den gesamten Datenzugriffscode, der erforderlich ist, um Benutzer und Rollen zu speichern und abzurufen. Dank des Anbietermodells kann diese Komponente problemlos mit einem Anbieter ersetzt werden, der Ihre bestimmte Datenquelle unterstützt.

Diese drei Komponenten arbeiten zusammen, um den Code zu reduzieren, der für die Bereitstellung von Mitgliedschaftsdiensten und die Verknüpfung der Mitgliedschaftsdienste mit einem persistenten Datenspeicher erforderlich ist.

Profile
In ASP.NET 1.x-Anwendungen wurden benutzerspezifische Daten häufig in der Sitzung gespeichert und bei Bedarf in einer Datenbank festgehalten. Dieser Prozess war häufig ineffizient und erforderte die Entwicklung eines speziellen Frameworkcodes.

ASP.NET 2.0 hilft bei der Lösung dieses Problems, indem es einen neuen Profildienst zur Verfügung stellt. Ein Profil ist einfach eine Sammlung mit Daten, die mit einzelnen Benutzern verknüpft sind. Das Profil kann jeden serialisierbaren Datentyp enthalten, angefangen von einfachen Datentypen (string, int usw.) bis hin zu komplexen Objekten. Im Gegensatz zu ASP.NET 1.x erfolgt die Verwaltung des Profils automatisch. ASP.NET 2.0 erstellt und speichert das Benutzerprofil selbstständig.

Den Kern des Profildienstes bildet der Profilanbieter. Der Profilanbieter enthält den gesamten Code und die erforderliche Struktur, um Benutzerdaten in einen Datenspeicher zu übernehmen und zu laden. Ähnlich wie der Mitgliedschaftsanbieter ermöglicht das Design des Profilanbieters, dass dieser mit einem Anbieter ersetzt werden kann, der Ihrer Wahl des Datenspeichers entspricht.

Webparts
Das Webpartsframework ist ein hoch entwickelter Ersatz für portalbasierte Websites, die HTML-Frames verwenden. Im Wesentlichen dienen Webparts der Erstellung einer Anwendung mit mehreren Komponenten, bei der die Benutzer festlegen können, welche Komponenten angezeigt werden sollen und wie die Komponenten zu konfigurieren bzw. auf der Seite anzuordnen sind. Nachdem authentifizierte Benutzer die Webparts nach Ihren Wünschen eingerichtet haben, wird das Layout automatisch sitzungsübergreifend beibehalten. Anders ausgedrückt: Webparts ermöglichen die Erstellung von Webanwendungen, die wie ein Desktop aussehen und funktionieren.

Webparts benötigen einen Personalisierungsanbieter, um die Persistenz von Webpartlayouts zwischen Sitzungen zu verwalten. Auch hier ist der Anbieter als erweiterbarer Teil des .NET Framework ausgelegt. Wenn Sie die im Framework verfügbaren Anbieter nicht verwenden möchten, können Sie problemlos Ihre eigenen erstellen.

 

Identifizieren und Verwalten von Benutzern

Der erste Schritt bei der Personalisierung einer Website ist die Herstellung eines Mechanismus zur Identifizierung und Verwaltung von Benutzern. Als Website-Benutzer müssen Sie über eine Methode verfügen, sich gegenüber der Website zu identifizieren, um auf Ihre personalisierten Inhalte zugreifen zu können. Als Website-Administrator hingegen benötigen Sie eine Möglichkeit, neue Benutzer zu registrieren, Benutzer bestimmten Rollen zuzuweisen und auf Anforderungen nach vergessenen Kennwörtern zu reagieren. Alle diese Funktionen wurden mit ASP.NET 2.0 deutlich vereinfacht.

Identifizieren von Benutzern
Bei traditionellen Webanwendungen wurde ein breites Spektrum von Mechanismen für die Identifizierung eines Benutzers verwendet. In ASP.NET 1.0 standen beispielsweise vier unterschiedliche Authentifizierungsmechanismen zur Verfügung, von der Windows-Authentifizierung bis hin zu benutzerdefinierten Formularen. Nach der Auswahl eines Authentifizierungsmechanismus musste nach wie vor eigener Code zur Unterstützung der Benutzerbasis erstellt werden, indem neue Benutzer angelegt, die Benutzer mit Rollen verknüpft und die Rollen auf der Website eingestuft wurden. Obwohl Technologien wie Windows-Authentifizierung und Active Directory bei der Lösung des Problems behilflich waren, musste der Webentwickler immer noch eine Menge Code erstellen.

ASP.NET 2.0 erweitert die grundlegenden Authentifizierungsmechanismen auf zwei Arten: Erstens enthält ASP.NET 2.0 eine Reihe neuer Steuerelemente zur Erstellung von Web Forms für die Anmeldung und Benutzerverwaltung, zweitens verfügt ASP.NET 2.0 über neue APIs zur Erstellung von Benutzerkonten und zur Verknüpfung von Benutzern mit bestimmten Rollen.

Die Tabelle beschreibt die Steuerelemente, mit denen identitätsbezogene Aspekte abgedeckt werden:

Name

Beschreibung

<asp:login>

Standardanmeldefunktionalität, die Benutzern die Eingabe von Anmeldeinformationen ermöglicht.

<asp:loginname>

Zeigt den Namen des angemeldeten Benutzers an.

<asp:loginstatus>

Gibt an, ob der Benutzer authentifiziert wurde.

<asp:loginview>

Bietet verschiedene Anmeldeansichten, je nach ausgewählter Vorlage.

<asp:passwordrecovery>

Sendet eine E-Mail-Nachricht mit einem vergessenen Kennwort an den Benutzer.

<asp:CreateUserWizard>

Benutzererstellungs-Assistent mit deklarativer Konfiguration.

<asp:ChangePassword>

Kennwortänderungs-Assistent mit deklarativer Konfiguration.

Das <asp:login>-Steuerelement erstellt die entsprechenden Beschriftungen, Textfelder und Schaltflächen zur Ermittlung von Benutzeranmeldeinformationen. Das Aussehen und Verhalten dieses Steuerelements kann mithilfe eines integrierten Formats geändert oder mithilfe von Stylesheets konfiguriert werden. Das Eigenschaften-Fenster ermöglicht auch den Zugriff auf die Beschriftung, den Wert und die Meldung zur Gültigkeitsprüfung. Außerdem können Sie das Aussehen der Anmeldeschaltfläche an individuelle Bedürfnisse anpassen.

Das Steuerelement <asp:passwordrecovery> verringert den Umfang des Entwicklercodes, der in Situationen erforderlich wird, in denen ein Kennwort verloren oder vergessen wurde. Mithilfe des SMTP-Protokolls, das über die Datei web.config konfiguriert wird, sendet das Kennwortwiederherstellungs-Steuerelement eine E-Mail-Nachricht mit dem Kennwort eines Benutzers an eine E-Mail-Adresse, die vorher mit dem angegebenen Konto verknüpft wurde.

Benutzerverwaltung
Zur Vereinfachung der Benutzerverwaltung enthält ASP.NET 2.0 ein integriertes Website-Konfigurationstool. Das Website-Verwaltungstool ist eine einfache Website, auf die nur über eine sichere Verbindung oder direkt auf dem lokalen Host zugegriffen werden kann. Mithilfe dieses Tools kann ein Administrator die Anwendung verwalten, indem Dienste wie die Benutzerverwaltung sowie die Personalisierungsanbieter, Sicherheit und Profile konfiguriert werden. Das Website-Konfigurationstool bietet ein grafisches Frontend für eine Vielzahl von ASP.NET 2.0-Technologien wie Personalisierung, Mitgliedschaft und Anbieter.

Die Mitgliedschafts-API stellt Funktionalität zur Benutzerverwaltung zur Verfügung, während das Profile-Objekt Angaben zu Benutzerpräferenzen verarbeitet. Auf die Mitgliedschafts-API kann auch programmtechnisch oder über Benutzersteuerelemente zugegriffen werden. In Fällen, in denen eine benutzerdefinierte Schnittstelle zur Benutzerverwaltung erforderlich ist, sollten Sie die Membership- und MembershipUser-Objekte verwenden, um Benutzerinformationen zu speichern und abzurufen. Für die meisten Authentifizierungsanforderungen bieten die Anmeldesteuerelemente einen sehr robusten und konfigurierbaren Mechanismus.

Personalisierungsanbieter
Der Personalisierungsanbieter erstellt eine Verknüpfung zwischen dem Webpartsfeature, das Personalisierungsdaten verwendet, und dem Datenspeicher, der Benutzerinformationen enthält. Über das Website-Verwaltungstool können Sie einen Personalisierungsanbieter konfigurieren und diesen mit einem SQL Server oder einer Access-Datenbank verknüpfen.

Das Schema in Abbildung 1 wird vom ASP.NET 2.0-Verwaltungstool und dem SQL Server-Personalisierungsanbieter verwendet:
personalisierungasp_net2_0_01.gif
Abbildung 1. Generiertes Datenmodell

In diesem Schema wird das Datenmodell dargestellt, das verwendet wird, um Mitgliedschaftsdaten zur Verwaltung von Benutzern auf einer personalisierten Website zu speichern. Beachten Sie, dass das genaue Schema von Ihrem Anbieter abhängig ist.

Obwohl im Lieferumfang von ASP.NET 2.0 Anbieter für SQL Server und Microsoft Access enthalten sind, ist das Anbieterframework auf Erweiterbarkeit ausgelegt. Die Erstellung eines Anbieters für eine andere Datenbank oder sogar eine XML-Datei erfordert lediglich die Entwicklung einer neuen provider-Klasse und deren Registrierung mit dem Verwaltungstool.

Verwalten von Benutzerkonten
Nach der Konfiguration der provider-Klasse und der Erstellung eines Datenspeichers besteht der nächste Schritt darin, den Datenspeicher mit Benutzerinformationen zu füllen. Das Website-Verwaltungstool verfügt über ein einfaches Formular zur Benutzererstellung, das es dem Administrator ermöglicht, einen neuen Benutzer zu erstellen und ein Kennwort in einer E-Mail-Nachricht an den Benutzer zu senden.
PersonalisierungASPNET20_02.gif
Abbildung 2. Benutzererstellung - Website-Verwaltungstool

Obwohl sich dieses Web Form zur Erstellung einer kleinen Anzahl von Benutzern eignet, unterstützen viele Websites hunderte oder tausende registrierter Benutzer. Glücklicherweise handelt es sich bei dem Website-Verwaltungstool nur um eine webbasierte Shell über der Verwaltungs-API. Anders ausgedrückt: Die Erstellung eines Benutzer-Stapeluploads oder die Erstellung eines Selbstregistrierungsformulars für Benutzer erfordert lediglich die Nutzung der relevanten ASP.NET 2.0-Klassen.

Programmtechnische Benutzererstellung
Die Mitgliedschafts-API kapselt die gesamte Funktionalität zur Benutzerverwaltung und kann über eine Vielzahl von Klassen aufgerufen werden. Die zwei wichtigsten Mitgliedschaftsklassen sind Membership und MembershipUser.

Die Klasse System.Web.Security.Membership enthält Methoden zum Erstellen, Löschen, Aktualisieren und Suchen von Benutzern. Wenn Sie innerhalb einer Anwendung ein Benutzerkonto erstellen möchten, rufen Sie einfach eine der CreateUser()-Methoden aus der Membership-Klasse auf.

try { 
    MembershipUser newUser = Membership.CreateUser("Seth", "trader"); 
} catch (MembershipCreateUserException mcue) { 
    string error = mcue.Message; 
}

In diesem Fall versucht die CreateUser-Methode, den neuen Benutzer mithilfe des zugrunde liegenden Mitgliedschaftsanbieters zu erhalten. Beim Auftreten eines Fehlers löst die CreateUser()-Methode eine MembershipCreateUserException-Ausnahme aus, die auf das entsprechende Problem hinweist. Sie können die Message- oder StatusCode-Eigenschaften der Ausnahme abfragen, um die genaue Art des Fehlers zu ermitteln.

Für eine weitergehende funktionale Fehlerbehandlung können Sie eine überladene Version von CreateUser verwenden, die eine ein-/ausgehende MembershipCreateStatus-Aufzählung akzeptiert und dadurch Fehlercodes für unterschiedliche Arten von Fehlerbedingungen liefert.

MembershipCreateStatus status;
MembershipUser newUser = Membership.CreateUser(
    "Seth", "trader", "seth@boilerroom.com", 
    "last name?", "Davis", true, out status);
if (status == MembershipCreateStatus.Success) {
    Server.Transfer("WebParts.aspx");
} else {
   //User creation failed, determine the failure type
    string errorcode;
    switch (status) {
     case MembershipCreateStatus.DuplicateUserName:
       errorcode = "Username already exists.";
       //resolve error condition and try again
       break;
     case MembershipCreateStatus.DuplicateEmail:
       // Other 8 conditions omitted for brevity

Die MembershipCreateStatus-Aufzählung wird als Ausgabeparameter an die CreateUser-Methode übergeben. Nach Beendigung der Methode kann das status-Objekt nach Fehlercodes abgefragt werden, die Ergebnisse lassen sich mit den vordefinierten Typen der MembershipCreateStatus-Aufzählung vergleichen.

Nach erfolgreicher Erstellung eines Benutzers werden die Details des Benutzers in einer System.Web.Security.MembershipUser-Klasse gekapselt. Die MembershipUser-Klasse kann für folgende Zwecke verwendet werden: Ermitteln des Zeitpunkts der letzten Aktivität, Ändern eines Kennworts oder einer Kennwort-Sicherheitsabfrage, Ändern von Kommentaren zum Benutzer und Genehmigen oder Deaktivieren des Benutzerkontos.

Programmtechnische Rollenzuweisung
Nach Erstellung eines Benutzers kann dieser über das System.Web.Security.Roles-Objekt einer Rolle hinzugefügt werden. Das Zuweisen einer Rolle erfordert lediglich die Verknüpfung des Benutzernamens mit dem Rollennamen.

Roles.AddUserToRole("Seth", "Administrator");

Beachten Sie, dass Benutzer und Rollen in ASP.NET nicht unbedingt mit Windows-Benutzern und -Rollen verknüpft sind.

Weitere Informationen zu Anmeldesteuerelementen
Der Großteil der Funktionalität in den Membership-, MembershipUser- und Roles-Klassen ist in den Anmeldesteuerelementen gekapselt. Die Verwendung von Anmeldesteuerelementen erspart Ihnen daher Zeit und Code bei der Entwicklung der Benutzerverwaltung. Mithilfe der Login-Steuerelemente und des neuen seitenübergreifenden Veröffentlichungsfeatures können Sie beispielsweise einen Benutzerregistrierungsprozess mit mehreren Schritten erstellen, der Benutzerinformationen sammelt, die Informationen überprüft und anschließend den neuen Benutzer dank der Anmeldesteuerelemente und des Mitgliedschaftsanbieters automatisch erstellt.

 

Erstellen eines personalisierten Benutzererlebnisses

Die meisten traditionellen Webanwendungen bieten wenig in Bezug auf ein personalisiertes Benutzererlebnis. Dies liegt an den Schwierigkeiten, die mit der Nachverfolgung, Speicherung und Verwendung von Benutzerinformationen für andere Zwecke als einfache Textanzeigen verbunden sind. Mit ASP.NET 2.0 können Sie jedoch schnell und problemlos eine Benutzeroberfläche erstellen, die spezifische Inhalte anzeigt, Benutzerinformationen speichert und Benutzern eine Änderung der Anzeige entsprechend ihrer Wünsche ermöglicht.

Profile
Profile sind konfigurierbare Mechanismen zur Erstellung speicherbarer Informationsgruppen für einen bestimmten Benutzer. Ein Profil kann verschiedenste Informationen speichern, vom Namen des Benutzers bis hin zu komplexen Datenobjekten. Profile ersetzen im Wesentlichen den Persistenzcode, der erforderlich ist, um Benutzerinformationen zu sammeln, diese in der Sitzung (oder in Cookies bzw. einer Datenbank) zu speichern und sicherzustellen, dass die Informationen zwischen Benutzersitzungen beibehalten werden.

Das Profile-Objekt wird mit einem XML-Schema konfiguriert, das in der web.config-Datei als ein XML-Element gespeichert wird. Sobald eine wohlgeformte Profilkonfiguration in einer web.config-Datei gespeichert wird, steht diese sofort der IDE und Laufzeitumgebung zur Verfügung. Ein Profil kann so einfach oder komplex sein, wie dies für die Anwendung erforderlich ist.

Definieren eines Profils
Ein Profil wird in der web.config-Datei mit einem bestimmten Satz an XML-Tags definiert. Jedes Element in einem Profil muss über eine Minimalspezifikation mit einem Namen und in der Regel einem Datentyp verfügen. Falls kein type-Attribut enthalten ist, wird der Standardtyp string angenommen. Alle Arten von Daten, von Basistypen bis zu benutzerdefinierten Objekten, können in einem Profil gespeichert werden. Sowohl der Name als auch der Datentyp werden von Visual Studio 2005 verwendet, um Intellisense zu ermöglichen und Laufzeitüberprüfung durchzuführen.

<profile> 
   <property name="NumberOfApples" type="int" /> 
</profile>

Die erstellte Eigenschaft wird mit dem Namen NumberOfApples referenziert und als Ganzzahl behandelt.

Eine Eigenschaft kann auch zusätzliche Attribute definieren, die u. a. festlegen, wie ein Profilelement gespeichert wird und ob das Element von anonymen Benutzern verwendet wird.

<profile>
   <property 
      name="EmailAddresses"    
      type="System.Collection.Specialized.StringCollection" 
      serializeAs="Xml" 
      allowAnonymous="false" 
      provider="SQL"/>
    <property name="NumberOfApples" type="int" defaultValue="3" />
</profile>

Dieses Protokoll definiert die Eigenschaft EmailAddress, die eine Vielzahl der Parameter nutzt, die für Eigenschaften zur Verfügung stehen. In der folgenden Tabelle werden alle Attribute aufgelistet, die auf eine bestimmte Eigenschaft anwendbar sind. Die meisten davon sind optional.

Attributname

Optional?

Beispielwerte

Beschreibung

name

Erforderlich

String

Ein eindeutiger Bezeichner für diese Eigenschaft.

type

Optional

Primitive | Benutzerdefinierter Typ

Ein .NET-Basistyp oder eine .NET-Klasse. Klassennamen müssen vollständig qualifiziert sein (z. B. Myapp.UserData.ColorPrefs).

serializeAs

Optional

String | Xml | Binary

Format des Werts beim Speichern im Datenspeicher.

allowAnonymous

Optional

true | false

Anonymen Zugriff auf diesen Wert einschränken oder zulassen. Falls dieser Wert auf false eingestellt ist, haben anonyme Benutzer keinen Zugriff auf diesen Profilwert.

provider

Optional

String

Der zur Verwaltung dieses Werts verwendete Anbieter. Überschreibt die Standardeinstellung defaultProvider in den Dateien web.config oder machine.config.

defaultValue

Optional

String

Rückgabewert, sofern die Eigenschaft nicht explizit festgelegt wurde.

readOnly

Optional

true | false

Schreibzugriff einschränken.

Das Attribut provider kann in Situationen, in denen unterschiedliche Teile des Profils durch unterschiedliche Anbieter gespeichert werden, eine wichtige Rolle spielen. So können beispielsweise private Benutzerdaten über einen Datenbankanbieter gespeichert werden, während weniger wichtige (oder leicht rekonstruierbare) Daten in einer XML-Datei gespeichert werden. Durch die Zuweisung spezifischer Anbieter lassen sich solche Szenarios problemlos realisieren.

Gruppieren von Eigenschaften
In vielen Fällen sollte ein Profil aus einer Anzahl von Eigenschaften bestehen, die gruppiert sind, um einen bestimmten Geschäftsaspekt zu vermitteln. So könnte beispielsweise eine Gruppe verwandter Eigenschaften Benutzerpräferenzen repräsentieren, während eine andere Gruppe Rechnungsinformationen zusammenfasst. In ASP.NET 2.0 lassen sich Eigenschaften mit dem <group>-Tag gruppieren.

<profile>
  <properties>
   <group name="Preferences">
    <add name="ShowQuoteOfTheDay" 
     defaultValue="true" type="System.Boolean" />
    <add name="ShowNews" type="System.Boolean" />
   </group>
   <group name="BillingAddress">
    <add name="Street" type="System.String" />
    <add name="City" defaultValue="Toronto" type="System.String" />
    <add name="StateProv" type="System.String" />
    <add name="ZipPostal" type="System.String" />
   </group>
  </properties>
 </profile>

Beachten Sie, dass jede Gruppe über einen eindeutigen Namen verfügen muss und die Elemente innerhalb der Gruppe eindeutig zu benennen sind. Elemente in unterschiedlichen Gruppen können jedoch den gleichen Namen tragen, da durch die Gruppenverknüpfung die Elemente eindeutig bleiben.

Zugreifen auf Profileigenschaften im Code
Sobald Sie ein Profil in der Datei web.config definiert haben, können Sie über das Profile-Objekt auf die unterschiedlichen Profilelemente zugreifen. Bei diesem Objekt handelt es sich tatsächlich um eine spezielle Unterklasse von System.Web.Profile.HttpProfileBase, die während der Seitenkompilierung generiert wird. Die Profile-Unterklasse enthält automatisch stark typisierte Zugriffsmethoden für alle Eigenschaften und Gruppen, die im Profil definiert werden. Das Profile-Objekt ist daher eine für jede Webanwendung angepasste Klasse. Aus der Entwicklerperspektive erscheint die Profile-Klassenerstellung automatisch und transparent.

Das Profile-Objekt bietet Schreib- und Lesezugriff auf die Eigenschaften im Profil des aktuellen Benutzers. Wenn eine Eigenschaft in einer Gruppe enthalten ist, fungiert die Gruppe wie eine zusätzliche Eigenschaft, die wiederum über Untereigenschaften verfügt. Als Entwickler programmieren Sie nur auf der Grundlage des Profile-Objekts, und ASP.NET übernimmt das automatische Laden und Speichern des Objekts.
personalisierungasp_net2_0_03.gif
Abbildung 3. Stark typisierte "web.config"-Eigenschaften mit Intellisense-Unterstützung

Visual Studio 2005 spiegelt Änderungen an der Datei web.config sofort wider. Eigenschaften werden über Intellisense verfügbar, sobald die web.config-Datei gespeichert wird. Wenn Sie also ein Profil während der Entwicklung ändern müssen, erkennt Visual Studio 2005 sofort die Änderung und bietet die entsprechende Toolunterstützung.

Webparts
Webparts sind modulare Komponenten, die mit einem WebPartManager zusammen verwendet werden und in WebPartZones enthalten sind. Sie können vom Benutzer eingebunden und angeordnet werden, um eine produktive Benutzeroberfläche zu erstellen, die nicht mit überflüssigen Details überladen ist. Der Benutzer kann:

  • die anzuzeigenden Webparts auswählen

  • die Webparts in jeder beliebigen Reihenfolge bzw. Anordnung konfigurieren

  • die Ansicht von einer Websitzung zur nächsten speichern

  • das Aussehen bestimmter Webparts anpassen

Es ist praktisch unmöglich, all diese Features mit herkömmlichen Webanwendungen zu implementieren.

Die Webpart-Architektur
Sie können sich Webparts als modulare Webseitenblöcke vorstellen. Jeder Block kann zur Laufzeit dynamisch zur Webseite hinzugefügt oder wieder entfernt werden. Code zur Organisation und Bearbeitung von Webparts ist in ASP.NET 2.0 enthalten. Die gesamte Funktionalität zum Hinzufügen, Entfernen und Konfigurieren des Layouts wird automatisch vom Webpartssystem übernommen. Der Programmierer erstellt einfach Webparts und ordnet diese den Webpartzonen zu. Ein Benutzer kann Webparts mischen und beliebig kombinieren, sie in beliebiger Reihenfolge anzeigen und dennoch davon ausgehen, dass die Konfiguration zwischen zwei Sitebesuchen gespeichert wird. Die gesamte Funktionalität von Webparts, einschließlich des Hinzufügens, des Entfernens und des Auflistens, wird mithilfe eines WebPartManagers automatisch übernommen.

Das Webpartsframework enthält folgende Schlüsselkomponenten:

  • Die Klasse System.Web.UI.WebControls.WebParts.WebPart: WebPart ist die Basisklasse mit Beschreibungen der Konfigurationseigenschaften, die es abgeleiteten Klassen ermöglichen, Mitglieder von Webpartzonen zu sein. Im Allgemeinen sind ein oder mehrere Steuerelemente in einer Unterklasse von WebPart gekapselt, oder ein einzelnes Benutzersteuerelement ist in einer GenericWebPart-Klasse enthalten.

  • Das Steuerelement System.Web.UI.WebControls.WebParts.WebPartZone: Das Steuerelement WebPartZone ist ein Wrapper für eine Auflistung von Webparts. Es stellt die Infrastruktur für die Webparts zur Verfügung und wird zur Definition des Aussehens und Verhaltens des durch die Webpartzone belegten Bildschirmbereichs verwendet.

  • Das Steuerelement System.Web.UI.WebControls.WebParts.WebPartManager: Jede Seite, die Webparts verwendet, ist mit einem WebPartManager verknüpft. Dieser konfiguriert und verwaltet den Zustand aller Webparts auf der Seite.

Diese drei Steuerelemente wirken bei der Erstellung von Webseiten zusammen, die im Aussehen und in der Funktionalität komplexen Desktopanwendungen gleichen.

Erstellen von Webparts
Ein Webpart kann auf drei verschiedene Arten erstellt werden. Die erste Möglichkeit besteht darin, ein gewöhnliches Benutzersteuerelement in einer WebPartZone abzulegen. Das Benutzersteuerelement wird automatisch in einem GenericWebPart-Wrapper gekapselt. Das ist die einfachste Methode, Personalisierung auf Benutzersteuerelemente auszudehnen.

Zweitens kann man ein Steuerelement erzeugen, das die Klasse WebPart erweitert. Diese Vorgehensweise könnte in Betracht kommen, wenn Sie das Verhalten des Webparts ändern oder mehr Kontrolle über die Funktionen und Eigenschaften des Webparts erhalten möchten. Sie müssen dann allerdings ein Serversteuerelement entwickeln, für das komplexerer Code und ein größerer Entwicklungsaufwand erforderlich sind als bei der Verwendung von GenericWebPart. Die Erweiterung der Basisklasse WebPart ist meist die bessere Wahl gegenüber der Implementierung der Schnittstellen, da der Code zur Verarbeitung von Verben und Benutzeraktionen durch den Einsatz eines WebPartManagers vererbt wird. Nachdem Sie von der Klasse geerbt haben, überladen Sie einfach die RenderContents()-Methode, um die speziellen Inhalte Ihres Webparts zu erzeugen.

Die dritte Möglichkeit besteht darin, die Schnittstellen IWebPart und IWebActionable zu implementieren. Die IWebPart-Schnittstelle definiert mehrere Methoden, die sich auf die Funktionsweise von WebPart beziehen. Die wichtigste Methode ist RenderContents(), die die Erzeugung der Ausgabe Ihres Webparts ermöglicht. Die IWebActionable-Schnittstelle andererseits definiert die Art und Weise, in der ein Webpart Verben und Benutzeraktionen unterstützt.

 

Ein einfacher Webpart

Am einfachsten erzeugen Sie einen Webpart, indem Sie ein beliebiges Benutzersteuerelement auf eine vorhandene WebPartZone ziehen. Diese Methode ermöglicht die schnelle Entwicklung von Webparts und ist gut geeignet für die Erstellung von statischem Inhalt. Auch wenn die Erzeugung einfach ist, bringt diese Methode der Webparterstellung doch eine Reihe von Einschränkungen mit sich. So erhält jedes Steuerelement, das einer WebPartZone hinzugefügt wird, seinen eigenen GenericWebPart-Wrapper. Dadurch führt das Hinzufügen vieler Steuerelemente zur Erzeugung vieler Webparts. Die Webparteigenschaften zur Steuerung der erweiterten Webpartfunktionalität stehen für generische Webparts nicht zur Verfügung. Wenn Sie GenericWebPart verwenden möchten, besteht die beste Herangehensweise darin, ein einzelnes Benutzersteuerelement zu erzeugen, das alle anderen kleineren Steuerelemente und den Inhalt enthält. Danach können Sie Ihr Benutzersteuerelement per Drag & Drop auf die WebPartZone ziehen und einen einzelnen Webpart erzeugen.

Beachten Sie, dass Sie den GenericWebPart-Wrapper niemals sehen werden. Das Webparts-Framework fügt zur Laufzeit automatisch einen GenericWebPart-Wrapper in die Steuerelementstruktur ein. Das Einbetten des Benutzersteuerelements in eine Wrapperklasse geschieht also automatisiert und wird vom ASP.NET 2.0-Compiler im Hintergrund ausgeführt.

 

Ein abgeleiteter Webpart

Um die gesamte Funktionalität von Webparts darzustellen, kann durch Erweiterung der Klasse WebPart ein benutzerdefinierter Webpart erzeugt werden. Die Schritte zur Erzeugung eines benutzerdefinierten Webparts gleichen der Vorgehensweise, die für die Erstellung eines benutzerdefinierten Server- oder Benutzersteuerelements erforderlich ist. Erzeugen Sie zunächst ein Objekt, das die Klasse WebPart erweitert.

using System;
using System.Text;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI;
namespace PartsLibrary {
    public class announcementControl : WebPart {
        public announcementControl() {}
        protected override void 
            RenderContents(HtmlTextWriter writer) {
            writer.Write(
        "Dr. William K Chin discovers new treatment for Ranaud's!");
        }
    }
}

Der oben abgebildete Code erzeugt eine Unterklasse von WebPart und überschreibt die Methode RenderContents() zur Ausgabe einer Meldung. Der Einfachheit halber ist dieses Beispiel relativ unkompliziert. Eine Klasse vom Typ announcementControl kann in einer realen Arbeitsumgebung jedoch eine komplexe Geschäftslogik kapseln. Beachten Sie, dass die Klasse im Namespace PartsLibrary definiert ist und in eine Assembly kompiliert werden sollte.

Fügen Sie der Assembly in dem Webprojekt, in dem Sie den announcementControl-Webpart verwenden möchten, nun eine Referenz hinzu. Der Webpart kann einfach aus der Toolbox per Drag & Drop den Seiten der Anwendung hinzugefügt werden. Sie können Ihrer ASPX-Seite auch direkt Code hinzufügen. Der folgende Code zeigt die benötigte Quelle zur Registrierung und Instanziierung von annoucementControl.

<%@ Register TagPrefix="jc1" Namespace="ClassLibrary1" Assembly="ClassLibrary1" %>
Ã,E
   <asp:WebPartZone ID="BottomZone" 
    Runat="server" Height="45px" Width="760px">
      <PartTitleStyle Font-Bold="True" 
       BackColor="Black" ForeColor="DarkKhaki">
      </PartTitleStyle>
         <RestoreVerb ImageUrl="~/images/RestoreVerb.GIF">
         </RestoreVerb>
         <HeaderStyle BackColor="Black" 
          ForeColor="DarkKhaki"></HeaderStyle>
         <MinimizeVerb ImageUrl="~/images/MinimizeVerb.GIF">
         </MinimizeVerb>
         <ZoneTemplate>
            <jc1:announcementControl 
             Runat="server" ID="AnnouncementControl1"
               ForeColor="#C00000" 
               BackColor="Silver" Title="Announcements"
               AllowHide="False" AllowMinimize="False" 
               AllowClose="False" />
         </ZoneTemplate>
   </asp:WebPartZone>

Die Register-Direktive verknüpft das Präfix jc1 mit dem benutzerdefinierten Webpart und stellt folglich alle Steuerelemente (hier announcementControl) innerhalb der Assembly für die Verwendung auf dieser Seite zur Verfügung. Der benutzerdefinierte Webpart jc1:announcementControl ist vollständig konfigurierbar und stellt Webparteigenschaften wie AllowHide und AllowMinimize zur Konfiguration zur Verfügung. Diese Optionen stehen bei der einfachen Methode zur Webparterstellung nicht zur Verfügung.
personalisierungasp_net2_0_04.gif
Abbildung 4. Webpart mit Steuerelement für Verben

Beachten Sie, dass der Webpart in Abbildung 4 dem Benutzer Standardverben nicht zur Verfügung stellt. In dem oben abgebildeten Code wurden diese Eigenschaften ausdrücklich deaktiviert. Durch die Deaktivierung bestimmter Webparteigenschaften können Sie sicherstellen, dass benötigte Seitenelemente nicht vom Benutzer versehentlich entfernt werden.

Diese Methode der Webparterstellung stellt auch weitere Features bereit, wie zum Beispiel die Koordination mit dem Personalisierungsanbieter, um Einzelheiten zu den Benutzereinstellungen über mehrere Sitebesuche hinweg zu erhalten.

 

Implementieren von Schnittstellen

Die letzte Möglichkeit zur Erstellung von Webparts besteht in der Implementierung der Schnittstellen IWebPart und IWebActionable. Bei der direkten Implementierung der Schnittstellen kann ein Entwickler das grundlegende Verhalten des Webparts-Frameworks ändern. Sie sollten diese Methode nur verwenden, wenn Sie jeden Aspekt der Funktionsweise eines Webparts direkt steuern möchten. In den meisten Fällen sollten Sie einfach die Klasse WebPart erweitern und das erneute Codieren der gesamten Webpartfunktionalität vermeiden.

Webpartzonen
Eine Webpartzone ist ein Speicherplatzbereich, in dem eine Auflistung von Webparts enthalten ist. Die Webpartzone ist ein Container mit Eigenschaften-Definitionen, die zur Änderung von Aussehen und Verhalten der Komponenten innerhalb ihrer Gültigkeitsbereiche geändert werden können.

Jede Webpartzone sollte die für die vollständige Erfüllung einer vorgegebenen Aufgabe erforderlichen Bestandteile und Steuerelemente der Benutzeroberfläche enthalten. Alle Webpartzonen sollten außerdem sich gegenseitig ausschließende Funktionalität enthalten. Durch die Sicherstellung der Unabhängigkeit der in jeder Webpartzone enthaltenen Funktionalität von allen anderen Webpartzonen entlastet der Entwickler den Benutzer von den Verwaltungsaufgaben komplexer Benutzeroberflächen.

Webpartzonen werden mithilfe des Steuerelementtags <asp:WebPartZone> innerhalb der ASPX-Seite definiert. Der unten abgebildete Code zeigt eine typische Webpartzonendefinition, die den Webpart "announcements" enthält. Beachten Sie, dass der folgende Code nicht die gesamte ASPX-Seite darstellt.

<asp:WebPartZone ID="BottomZone" Runat="server" 
      Height="45px" Width="760px">
      <PartTitleStyle Font-Bold="True" 
        BackColor="Black" ForeColor="DarkKhaki">
      </PartTitleStyle>
         <RestoreVerb ImageUrl="~/images/RestoreVerb.GIF">
         </RestoreVerb>
         <HeaderStyle BackColor="Black" ForeColor="DarkKhaki">
         </HeaderStyle>
         <MinimizeVerb ImageUrl="~/images/MinimizeVerb.GIF">
         </MinimizeVerb>
         <ZoneTemplate>
            <jc1:announcementControl Runat="server" 
             ID="AnnouncementControl1"
               ForeColor="#C00000" BackColor="Silver" 
               Title="Announcements"
               AllowHide="False" AllowMinimize="False" 
               AllowClose="False" />
         </ZoneTemplate>
    </asp:WebPartZone>

Eine Webpartzone muss mit einem eindeutigen ID-Attribut konfiguriert werden, die vom Webpartmanager-Steuerelement zur Identifizierung einer bestimmten Zone innerhalb der Seite verwendet wird. Der Titel wird bei der Bearbeitung des Seitenlayouts als Überschrift für die Webpartzone angezeigt.

Webpartverben
Webpartverben sind Elemente der Benutzeroberfläche, die den Benutzer in die Lage versetzen, spezielle, auf Webparts bezogene Aktionen auszuführen. Webpartverben entsprechen den Standardbefehlen und -symbolen, die auch in den meisten Desktopanwendungen unter Windows enthalten sind. Diese Verben werden vom Element WebPartZone definiert, das eine Reihe von Standardverben zur Verfügung stellt: Close, Minimize, Restore, Help, Edit, Connect und Export.

Jedes Verb kann als XML-Element innerhalb der Webpartzone konfiguriert werden.

<asp:WebPartZone id="Zone1"  runat="Server">
  CloseVerb ImageUrl="images/CloseVerb.jpg"
            Enabled="True"
            Text="Close"
            Description="Closes the WebPart"
            visible="True" />
  <ZoneTemplate>
     <custom:QuoteWebPart title="Quotations" 
      id="QuoteWebPart" runat="Server" />
  </ZoneTemplate>
</asp:WebPartZone>

Ein typisches Verb enthält eine Reihe von Parametern, die seinen Zustand und seine Darstellung beschreiben. Ein Bild kann beispielsweise mit dem Verb verknüpft werden, das das Attribut imageUrl verwendet. Das Bild stellt in der Regel eine ausführbare Aktion als kleines Symbol dar.

Verben werden in der rechten oberen Ecke der Titelleiste des Elements WebPartZone angezeigt. In der Standardeinstellung wird das Verb als einfacher Text dargestellt. Durch die Zuordnung eines Symbols können jedoch benutzerdefinierte Darstellungen von Verben erzeugt werden.
personalisierungasp_net2_0_05.gif
Abbildung 5. Webpartverben

Verben verfügen über eine QuickInfo, die als Beschreibung der beabsichtigten Aufgabe konfiguriert werden kann. Wenn Verben, die mit Symbolen ausgestattet sind, zu Webparts hinzugefügt werden, kann daher der für die Vermittlung allgemeiner Funktionalität verwendete Bildschirmbereich verringert werden.

Vorlagen
In ASP.NET 2.0 werden Vorlagen verwendet, um häufig verwendete Elemente von Benutzersteuerelementen zu konfigurieren. Die Webpartskomponenten verwenden ebenfalls Vorlagen, um das Aussehen und Verhalten von Webparts auf der Seite zu konfigurieren. Webparts werden einem WebPartZone-Element hinzugefügt, indem sie innerhalb des Tags <ZoneTemplate> platziert werden. Die Vorlage ZoneTemplate definiert das Standardlayout der enthaltenen Webparts.

<ZoneTemplate> 
  <custom:DrugWebPart Title="Drugs" bgcolor="#333333"  
   id="DrugWebPart1" runat="server" />  
  <custom:ScheduleWebPart Title="Schedules"  
   id="QuoteWebPart2" runat="server" />    
  <custom:EventsWebPart Title="Daily Events"  
   id="QuoteWebPart3" runat="server" /> 
</ZoneTemplate>

Alle in derselben Vorlage gespeicherten Webparts verfügen über das gleiche Aussehen und Verhalten. Beachten Sie, dass die Elemente CatalogZone und EditorZone ebenfalls eine Vorlage ZoneTemplate definieren und dass die Vorlage ZoneTemplate für diese Zonen in Aussehen und Verhalten von den Standardwebpartzonen abweichen kann. Vielleicht möchten Sie zum Beispiel die Katalogzone durch Änderung des Aussehens und Verhaltens hervorheben, wenn der Benutzer in den Katalogmodus schaltet. Durch die Verwendung von auf Vorlagen beruhenden Steuerelementen haben Entwickler mit ASP.NET 2.0 die Möglichkeit, das Aussehen und Verhalten von Webparts deklarativ zu definieren. Vorlagen fördern auch eine für Steuerelemente konsistentere Benutzeroberfläche. Das führt zu besseren Erfahrungen mit diesen interaktiven Komponenten für die Benutzer.

Webpart-Manager
Ein Webpart-Manager, und wirklich nur ein einziger, muss jeder Seite hinzugefügt werden, die Webparts einsetzt. Das Manager-Steuerelement muss hinzugefügt werden, bevor irgendeine Webpartzone hinzugefügt wird. Es ist dafür zuständig, den Zustand aller Webparts auf der Seite zu verfolgen.

Besonders wichtig ist die Eigenschaft DisplayMode des Webpart-Manager-Steuerelements, da sie die Art der für den Benutzer zur Verfügung stehenden Konfigurationsoptionen definiert. DisplayMode kann verschiedene Werte erhalten.

  • Catalog: Zeigt eine Liste der Webparts an und ermöglicht die Änderung der Anordnung.

  • Design: Ermöglicht dem Benutzer das Umstellen der Webparts auf der Seite.

  • Edit: Ermöglicht dem Benutzer das Bearbeiten bestimmter Attribute einzelner Webparts.

  • Connect: Stellt die Kommunikationsmöglichkeit zwischen zwei Webparts zur Verfügung.

  • Browse (Standardeinstellung): Zeigt die Seite so an, wie in den Benutzereinstellungen festgelegt wurde.

Mithilfe der verschiedenen Modi können Entwickler die gewünschte Funktionalität für die Benutzer zur Verfügung stellen. So kann der Benutzer beispielsweise im Katalogmodus, dargestellt in Abbildung 6, die anzuzeigenden Webparts auswählen. Im Katalogmodus kann der Benutzer die Katalogzone des Elements WebPartManager sehen. Webparts können ausgewählt werden und mithilfe der Schaltfläche Add (Hinzufügen) zu einer Zone der Seite hinzugefügt werden. Dies ist der einzige Modus, in dem Webparts zur Seite hinzugefügt werden können.
personalisierungasp_net2_0_06.gif
Abbildung 6. Katalogmodus - Webparts

Ein typischer Katalog enthält verschiedene Webparts, von denen jeder spezielle Informationen anzeigt oder dem Benutzer den Zugriff auf bestimmte Funktionen ermöglicht. Der Katalog in Abbildung 6 ist beispielsweise ein Teil eines Webportals für ein Krankenhaus. Ärzte, Krankenschwestern und Verwaltungsangestellte verwenden dieses Portal, um auf Termine, tägliche Veranstaltungen, Bekanntmachungen und Patienteninformationen zuzugreifen. Da das Portal Patienteninformationen zur Verfügung stellt, ist Sicherheit ein wichtiges Anliegen. Das Portal verlässt sich daher auf den Mitgliedschaftsdienst, um jeden Benutzer zu identifizieren und festzustellen, welche Informationen angezeigt werden dürfen.

Sobald der Benutzer die der Zone hinzuzufügenden Webparts ausgewählt hat, kann er auf die Schaltfläche Close (Schließen) klicken, um zum Übersichtsmodus zurückzukehren und das entstandene Layout zu betrachten:
personalisierungasp_net2_0_07.gif
Abbildung 7. Übersichtsmodus - Webparts

In Abbildung 7 wird beispielsweise das Webpartlayout für Dr. Jayesh Patel dargestellt. Dr. Patel hat sich dafür entschieden, Webparts für die aktuelle Patientenliste (oben links), die Arzneisuche (unten links) und Rechnungsinformationen (rechts) anzuzeigen.

Ein Webpart kann mithilfe der in ASP.NET enthaltenen Drag & Drop-Funktionalität von einer Webpartzone in eine andere verschoben werden. Dr. Patel könnte sich beispielsweise entschließen, die Patientenliste und die Rechnungsinformationen rechts auf der Seite zu gruppieren.
personalisierungasp_net2_0_08.gif
Abbildung 8. Drag & Drop auf einer Webseite

In Abbildung 8 wird ein Webpart dargestellt, der von der LeftZone in die MainZone gezogen wird. Jeder verfügbare Webpart kann in jeder beliebigen Webpartzone platziert werden. Sobald der Webpart vom Benutzer neu angeordnet wurde, wird der Seitenstatus auf einem sekundären Speicher gesichert. Bei nachfolgenden Besuchen des Benutzers auf der Website wird das Webpartlayout des Benutzers wieder abgerufen.

Der Personalisierungsanbieter
Webpartlayouts und die Konfiguration werden vom Personalisierungsanbieter gespeichert. Dieser Anbieter gleicht dem Mitgliedschaftsanbieter und dem Profilanbieter insofern, dass er die bestehenden Benutzerinformationen auf die gleiche Weise verwaltet. Der Personalisierungsanbieter ist jedoch speziell für das Speichern der Webpartkonfigurationen der einzelnen Benutzer zuständig.

 

Speichern von Benutzerdaten mit Anbietern

In ASP.NET 2.0 wird das Anbietermodell durchgehend als Mechanismus zur Erweiterung und Verbesserung des Frameworks verwendet. Der Anbieter ist dabei ein Muster bzw. ein Punkt, an dem Entwickler das ASP.NET 2.0-Framework an ihre besonderen Anforderungen anpassen können. Beispielsweise kann ein Entwickler einen neuen Anbieter erstellen, um das System zur Benutzeridentifizierung zu unterstützen oder um Personalisierungsdaten in einem anderen Datenspeicher zu speichern.

Die meisten benutzerdefinierten Anbieter interagieren mit den Back-End-Systemen von Datenbanken. Dem Programmierer ist es jedoch freigestellt, die erforderlichen Methoden und Klassen des Anbieters mit beliebigen Medien oder Algorithmen zu implementieren, solange diese die Schnittstellenspezifikation des Modells erfüllen.

Das Anbietermodell
Das Anbietermodell ist aus einigen allgemein anerkannten Entwurfsmustern abgeleitet. In diesem Modell werden verschiedene Klassen und Hooks zur Datenpersistenzebene definiert, die für bestimmte Anforderungen die Datenspeicherung und den Datenabruf ermöglichen. Dadurch dient das Anbietermodell als Programmierspezifikation, durch die ASP.NET 2.0 eindeutige Clientanforderungen bedienen kann.

Im Zusammenhang mit Personalisierung verwendet ASP.NET 2.0 drei verschiedene Anbieter:

  • Membership: Der Mitgliedschaftsanbieter unterstützt Benutzerauthentifizierung und -verwaltung.

  • Profile: Der Profilanbieter unterstützt die Datenspeicherung und den Datenabruf für benutzerspezifische Daten, die mit einem Profil verknüpft sind.

  • Personalization: Der Personalisierungsanbieter unterstützt die Persistenz von Webpartskonfigurationen und -layouts für einzelne Benutzer.

Jeder Anbietertyp ist von den anderen Anbietern unabhängig. Deshalb können Sie den Anbieter Profile ersetzen, ohne dass dies zu Problemen mit dem Anbieter Membership führen kann.

Auswählen aus vorhandenen Anbietern
ASP.NET 2.0 enthält für jeden Anbietertyp zwei Standardanbieter. Der eine Anbieter stellt Verbindungen zu SQL Server her, der andere verwendet Microsoft Access. Wie bereits erwähnt, sind die Anbieter vollkommen unabhängig voneinander. Dies gilt auch, wenn sie einen gemeinsamen Datenspeicher verwenden.

Die Auswahl des richtigen Anbieters ist somit eine Frage der Anforderungen an die Fähigkeiten des Datenspeichers. Beispielsweise stellt der Anbieter AccessPersonalizationProvider eine Verbindung zu Microsoft Access her und ist für kleinere Sites gedacht, bei denen die Personalisierungsdaten vergleichsweise einfach gehalten sind. Mit AccessPersonalizationProvider ist die Bereitstellung bedeutend einfacher, da für Microsoft Access nicht dieselben Anforderungen zu erfüllen sind wie für Microsoft SQL Server. Der Anbieter SqlPersonalizationProvider ist jedoch flexibler und bietet mehr Konfigurationsmöglichkeiten. Er ist für Szenarios gedacht, in denen die Skalierbarkeit einer Access-Datenbank ein Problem werden könnte.

Eine ähnliche Analyse kann auch für die anderen Anbietertypen durchgeführt werden. Wenn weder Access noch SQL Server Ihre Anforderungen an die Datenspeicherung erfüllen, können Sie letztendlich einen eigenen Anbieter erstellen und ihn über die Verwaltungswebsite in das Framework einbinden.

Entwickeln von benutzerdefinierten Anbietern
Die Erstellung eines neuen Anbieters ist ebenso einfach wie die Implementierung einer neuen Klasse, die die funktionalen Anforderungen des Anbieters erfüllt. Sobald Sie die Klasse entwickelt haben, können Sie diese mit dem Website-Wartungstool registrieren und dadurch als Anbieter des richtigen Typs aktivieren.

Ziehen Sie eine benutzerdefinierte Anbieterlösung in Betracht, wenn die Personalisierungsdaten bereits vorhanden bzw. für die Verwaltung mit einem Standardanbieter zu komplex sind. Wenn für eine Anwendung Personalisierungsdaten erforderlich sind, die auf mehrere Datenquellen verteilt sind (z. B. Benutzerdaten in einem LDAP-Verzeichnis und Personaldaten in einer Back-End-Personaldatenbank) können Sie einen benutzerdefinierten Anbieter als Schnittstelle für ein homogenes Datensystem verwenden.

 

Benutzerdefinierte Mitgliedschaftsanbieter

Die Erstellung eines benutzerdefinierten Mitgliedschaftsanbieters umfasst mehrere Schritte:

  1. Schreiben Sie eine neue, von System.Web.Security.MembershipProvider abgeleitete Klasse.

  2. Registrieren Sie den Anbieter mit dem Web-Konfigurationstool. Sie können den Anbieter manuell registrieren, indem Sie ein neues Element <connectionStrings> und ein Element <membership> hinzufügen.

      <configuration>    
    <connectionStrings>
      <add name="MembershipProviderConnection" 
        connectionString="DATA\mydb.mdb" />
    </connectionStrings>
    <system.web>
      <membership defaultProvider="FlatFileProvider">
        <providers>
          <add connectionStringName="MembershipProviderConnection"
                applicationName="/DoctorPortal"
                description="Flat file membership provider"
                requiresUniqueEmail="true"
                enablePasswordRetrieval="false"
                enablePasswordReset="true"
                requiresQuestionAndAnswer="false"
                passwordFormat="Hashed"
                name="catdog"
                type="MyCode.Membership.FlatFileProvider, 
                      MyCode.Membership,
                  Version=1.1.1300.0, Culture=neutral, 
                  PublicKeyToken=xxxxxxxxxxxxxxxx" />
              </providers>
          </membership>
    
      //other configuration pieces
      </system.web>
    
  3. Unabhängig von der Art der Registrierung des Anbieters können Sie deklarieren, ob der Anbieter die verschiedenen Mitgliedschaftsfeatures (z. B. automatische Kennwortabfrage oder das verwendete Kennwortformat) unterstützt.

  4. Stellen Sie der Anwendung den Datenspeicher (die Datenbank oder eine andere Datenquelle) zur Verfügung.

Sobald der Mitgliedschaftsanbieter erstellt ist, können Sie Benutzer und Rollen in Ihrem Datenspeicher organisieren und verwalten.

 

Benutzerdefinierte Profilanbieter

Gehen Sie zur Entwicklung eines benutzerdefinierten Profilanbieters ähnlich vor, leiten Sie die Implementierungsklasse jedoch von System.Web.Profile.ProfileProvider ab. Die Klasse ProfileProvider wird von System.Configuration.SettingsProvider abgeleitet, die wiederum von System.Configuration.Provider.ProviderBase erbt. Deshalb muss jeder benutzerdefinierte Profilanbieter alle erforderlichen Methoden der abstrakten Klassen ProfileProvider, SettingsProvider und ProviderBase implementieren.

Anschließend können Sie das Personalisierungsframework so konfigurieren, dass es den benutzerdefinierten Anbieter verwendet. Fügen Sie hierfür der Datei web.config einen neuen Eintrag hinzu.

<profile defaultProvider="OdbcProvider">
   <providers>
      <add name="OdbcProvider" 
       type="Samples.AspNet.Profile.OdbcProfileProvider"
                 connectionStringName="OdbcProfile" />
   </providers>
</profile>

Im vorhergehenden Code wird der Profilabschnitt der Datei web.config dargestellt. Dabei wird der Anbieterliste der Profilanbieter OdbcProvider hinzugefügt und das Attribut defaultProvider auf OdbcProvider gesetzt. Mehr als diese Konfiguration und eine gültige Implementierung der Klasse ProfileProvider sind für die Implementierung eines benutzerdefinierten Anbieters nicht erforderlich.

 

Benutzerdefinierte Personalisierungsanbieter

Auch die Erstellung eines benutzerdefinierten Personalisierungsanbieters entspricht diesem Vorgehen, jedoch muss ein Personalisierungsanbieter von der Klasse System.Web.UI.WebControls.WebParts.PersonalizationProvider abgeleitet werden. Einmal erstellt, kann der Anbieter mit dem Web-Konfigurationstool automatisch registriert werden, oder Sie registrieren ihn manuell, indem Sie dem Abschnitt <providers> des Tags <personalization> (das Sie innerhalb des <webParts>-Elements der Datei web.config finden) einen Eintrag hinzufügen.

Wie auch bei anderen benutzerdefinierten Anbietern müssen Sie eine gültige Datenquelle erstellen und diese für die Anwendungen verfügbar machen. Die Personalisierungsdatenquelle kann aus einer XML-Datei oder aus Einträgen in Active Directory bestehen. In beiden Fällen müssen Sie für die Personalisierung ein entsprechendes Schema definieren.

 

Schlussfolgerung

Zur Personalisierung einer Website musste bisher sehr viel komplexer unterstützender Code implementiert werden. Mit den neuen Personalisierungsfeatures von ASP.NET 2.0 können Entwickler jedoch nicht nur schneller personalisierte Anwendungen schaffen, sie können auch vollständig neue Klassen von Anwendungen erstellen. Mithilfe des Benutzerverwaltungssystems und der Anmeldesteuerelemente können Benutzer noch einfacher als bisher identifiziert werden, die Profilfeatures erleichtern das schnelle und effiziente Speichern von Benutzerdaten. Auf der anderen Seite bietet das Webparts-Framework ein neues und revolutionäres Entwurfsparadigma für Websites. Dank Webparts ist eine Website nicht länger auf das lineare Dokumentenformat beschränkt, das die Basis des HTML-Standards bildet. Webparts bieten eine wesentlich höhere Flexibilität und ermöglichen Entwicklern das Erstellen von Webanwendungen, die nur schwer von den leistungsstärksten Desktopsystemen zu unterscheiden sind.

Verwandte Literatur