Rob Howard
Als Kind verbrachte ich jedes Jahr ein paar Wochen mit meiner Großfamilie. Als kleiner amerikanischer Junge war ich von niederländischen Elektrozügen fasziniert, etwas, das ich in meiner Heimatstadt Dallas, Texas, noch nie gesehen hatte. Meine Cousins luden mich zu einer Bootsfahrt ein, um einen vorbeifahrenden Zug zu beobachten. Wenn Sie auf dem Wasser in der Nähe der Gleise sitzen, können Sie den herannahenden Zug wie ein sanftes Pfeifen über die Gleise hören, bis er einen langsamen Höhepunkt erreicht, wenn der Zug vorbeiruft. Wenn ich über ASP.NET 2.0 nachdenke, muss ich daran erinnert werden. ASP.NET 2.0 steht kurz vor der Tür und die meisten von uns erwarten seine baldige Veröffentlichung so sehr, dass wir sogar das „Wow“ hören, dass die Veröffentlichung immer lauter wird. Dann wird sich die Art und Weise, wie wir Software schreiben, erneut ändern.
Das Ziel von Microsoft ASP.NET 2.0 besteht darin, Entwicklern eine Leistung von 50 % zu bieten. Die tatsächlichen Leistungsverbesserungen scheinen jedoch die Erwartungen zu übertreffen. Neue Personalisierungs-, Mitgliedschafts- und Rollenverwaltungsfunktionen entlasten Entwickler, während andere Funktionen, wie die Datenbindung, ebenfalls vereinfacht werden. Beispielsweise die bekannte und immer noch unterstützte Syntax:
<%# DataBinder.Eval (Container.DataItem, "FirstName") %>
In ASP.NET 2.0 kann es wie folgt vereinfacht werden:
<%# Eval("FirstName") %>
Es gibt nicht nur eine Menge beeindruckender neuer Funktionen, sondern auch eine Menge sinnvoller Serversteuerungen. Das ASP.NET-Programmiermodell wird in ASP.NET 2.0 durch die Integration der Mitgliedschaft in Serversteuerelemente wie das <ASP:login>-Steuerelement und neue Datenquellen- und Datensteuerungsserversteuerelemente noch leistungsfähiger.
Die Anzahl der System.Web-Klassenbibliotheken hat sich in ASP.NET 2.0 fast verdoppelt – so viel Abdeckung, dass sogar eine Zeitschriftenkolumne erforderlich ist. Um das Ausmaß dieser Änderungen wirklich zu verstehen, benötigen Sie ein neues ASP.NET 2.0-Buch. Ich habe vor, hier einige Kolumnen zu schreiben, um einige der wichtigeren neuen Funktionen von ASP.NET 2.0 hervorzuheben. Diesen Monat werde ich mich auf Navigation und Seitenfluss konzentrieren, beginnend mit einer sehr gefragten Funktion – der Möglichkeit, an andere Seiten zu senden.
Seitenübergreifende Bereitstellung
Die größte Beschwerde, die ich von Entwicklern höre, die auf ASP.NET migrieren, ist das Seiten-Postback-Modell, das ein einzelnes <form> haben kann und nur über HTTP an sich selbst zurücksenden kann, sodass die gesamte Verarbeitungslogik weiter ausgeführt wird diese Seite.
Viele Entwickler, insbesondere diejenigen, die mit ASP vertraut sind und das <form>-Element steuern möchten, wissen, dass Sie in ASP dem <form> anweisen können, wo und wie seine Inhaltsdaten (HTTP-Post oder HTTP-Get) übermittelt werden sollen gleiche Seite Die Menge von <form>. Aber im Vergleich zu ASP erlaubt ASP.NET einer Seite nur, nur einen <form runat=server> zu haben, und sie kann nur an sich selbst zurückgesendet werden. Dies kann sehr frustrierend sein. Hier ist ein Beispiel dafür, was an andere Seiten in ASP.NET 2.0 gesendet wird:
<%@ Page MasterPageFile="~/Site.master" Language="C#"
CodeFile="Source.aspx.cs"
Inherits="Quelle" %>
<ASP:Content ID="MainContent"
ContentPlaceHolderID="Main" Runat="server">
Geben Sie Ihren Namen ein:
<ASP:TextBox ID="NameBox" Runat="server"></ASP:TextBox>
<ASP:Button ID="Button1" Runat="server" Text="Submit" />
</ASP:Inhalt>
Masterseiten werden zur Steuerung des Seitenlayouts verwendet, mit einem <ASP:content>-Block und einigen Serversteuerelementen zur Annahme von Benutzereingaben.
Wenn Sie Inhalte an eine andere Seite übergeben möchten, können Sie einen Servercode ähnlich dem folgenden verwenden:
Response.Redirect("Target.aspx?Name= " +
HttpUtility.UrlEncode(NameBox.Text));
Das Problem bei dieser Technologie besteht darin, dass der Server die Anfrage akzeptiert und eine Antwort sendet, um den Browser an Target.aspx umzuleiten, wenn der Benutzer auf die Schaltfläche zum Senden klickt. Solch ein einfaches Problem hat viel Arbeit geleistet!
Kann die Arbeit vereinfacht werden? In ASP.NET 2.0 lautet die Antwort „Ja“. Demonstrieren Sie als Nächstes den verbesserten Code:
<%@ Page MasterPageFile="~/Site.master" Language="C#"
CodeFile="Source.aspx.cs"
Inherits="Quelle" %>
<ASP:Content ID="MainContent"
ContentPlaceHolderID="Main" Runat="server">
Geben Sie Ihren Namen ein:
<ASP:TextBox ID="NameBox" Runat="server"></ASP:TextBox>
<ASP:Button ID="Button1" Runat="server" Text="Submit"
PostBackUrl="~/Target.aspx" />
</ASP:Inhalt>
Beachten Sie das PostBackUrl-Attribut in <ASP:Button>. Dieses Attribut weist die Schaltfläche an, das Standard-Postback nicht durchzuführen, sondern Daten direkt an Target.aspx zu senden.
Sie fragen sich möglicherweise, wie das funktioniert, insbesondere wenn Sie mit ASP.NET ViewState vertraut sind Objekt. Dies geht jedoch über den Rahmen dieses Artikels hinaus. Wenn die seitenübergreifende Bereitstellungsfunktion verwendet wird, wird der Seite ein neues ausgeblendetes Feld hinzugefügt:
<input type="hidden" name="__PREVIOUSPAGE" id="__PREVIOUSPAGE"
value="p1-dFHlCpgH2alr1vkr3G21UIR7jOuzn074led6lbGf1KQ47_F25GwG0" />
Es ähnelt ein wenig dem vom Kontrollbaum generierten Ansichtsstatus, ist jedoch ein Fragment des Ansichtsstatus, das die Seite für die seitenübergreifende Bereitstellung validiert. Sie wissen, dass beim Cross-Posten einer Seite auf einer anderen Seite die empfangende Seite auf die Instanz der Posting-Seite zugreifen können muss. In diesem Fall bedeutet dies, dass Target.ASP auf die Details von Source.aspx zugreifen kann. Tatsächlich besteht ein effizienterer Ansatz darin, über einen stark typisierten Manager auf die API von Source.aspx bis Target.aspx zuzugreifen. Um auf die Auslieferungsseite (vorherige Seite) zuzugreifen, stellt ASP.NET2.0 ein Seitenattribut für die seitenübergreifende Auslieferung bereit: PreviousPage.
PreviousPage gibt die Instanz der Zustellungsseite zurück, und es gibt auch eine Eigenschaft, mit der überprüft wird, ob es sich um eine seitenübergreifende Zustellung handelt: IsCrossPagePostBack. Diese Eigenschaft ähnelt dem vorhandenen IsPostBack, gibt jedoch nur dann „true“ zurück, wenn ein seitenübergreifender Beitrag erfolgt.
Die PreviousPage-Eigenschaft kann sich anders verhalten. Die Standardeinstellung gibt einfach eine Instanz der vorherigen Seite als Seitentyp zurück. Mithilfe einer neuen Anweisung können Sie jedoch veranlassen, dass die PreviousPage-Eigenschaft eine stark typisierte Instanz zurückgibt, um auf die öffentlichen Mitglieder der Seite zuzugreifen. Fügen Sie beispielsweise den folgenden Code zu Target.aspx hinzu:
<%@ PreviousPageType VirtualPath="~/Source.aspx" %>
Sie können jetzt die PreviousPage-Eigenschaft für Target.aspx verwenden, um auf die Daten von Source.aspx zuzugreifen. Um jedoch auf ein Serversteuerelement wie die NameBox in Source.aspx zuzugreifen, müssen Sie auch den folgenden Code schreiben:
TextBox nameBox = PreviousPage.FindControl("NameBox") as TextBox.
Mit anderen Worten, Sie müssen FindControl verwenden, um Zugriff auf den Kontrollbaum. Warum? Serversteuerelemente verwenden standardmäßig geschützte Mitgliedsvariablen. Um wirklich einfachen Zugriff auf die Elemente der vorherigen Seite zu haben, müssen Sie die Eigenschaft oder Methode in Source.aspx als öffentlich verfügbar machen. Dann funktioniert der folgende Code: TextBox nameBox = PreviousPage.
Die seitenübergreifende Bereitstellung ist eine großartige Funktion von ASP.NET. Es gibt einige Artikel, in denen die technischen Details der seitenübergreifenden Bereitstellung ausführlich erläutert werden Lesen Sie Dino Espositos Cutting in der September-Ausgabe der Edge-Kolumne des MSDN Magazine (siehe meine Übersetzung: ASP.NET Form (Übersetzung)). Sie werden wahrscheinlich auch feststellen, dass Sie, wenn Sie ASP.NET beherrschen, die meiste Zeit weiterhin das Standard-Seiten-Postback-Modell verwenden werden. (Übersetzer: Die Implikation ist, dass Sie als Experte diese Funktion verachten werden.)
Die Assistentensteuerung
kann durch seitenübergreifende Bereitstellung problemlos eine komplexe Navigationsfunktion für die Anwendung erstellen. Diese Funktion erleichtert jedoch nicht die Erstellung von Benutzeroberflächen im Assistentenstil. Benutzeroberflächen im Assistentenstil, ob linear oder nichtlinear, sind oft darauf ausgelegt, Aufgaben zu erledigen. Es bietet Endbenutzern eine benutzerfreundliche Möglichkeit, eine komplexe Reihe von Schritten auszuführen, die jeweils in Abschnitte unterteilt sind.
In ASP.NET 1.x wurden Assistenten häufig mithilfe einiger Tricks implementiert: Platzieren mehrerer <ASP:panel>-Serversteuerelemente auf derselben Seite und Umschalten der Sichtbarkeit basierend auf dem Standort des Benutzers. Das Schreiben eines Assistenten in ASP.NET ist keine leichte Aufgabe. Viele Designer verzichten auf den Assistenten, und auch die Verwaltung des Schrittprozesses ist verwirrend.
Die neuen seitenübergreifenden Bereitstellungsfunktionen in ASP.NET können zur Lösung des Assistentenproblems verwendet werden, stellen jedoch auch eine Herausforderung dar, wenn eine nichtlineare Navigation erforderlich ist. Beispiel: Schritt 1, Schritt 2, Schritte 3-5 überspringen, Schritt 6, Schritt 3, Schritt 2, Schritt 6, die ASP.NET 2.0-Assistentensteuerung löst die meisten dieser Probleme. Darüber hinaus sind alle Eingabeelemente des seitenübergreifenden Bereitstellungsassistenten über das Seiten-Postback-Modell kontinuierlich zugänglich.
Die Funktionalität des Assistenten-Steuerelements kommt der Art und Weise, Panels in ASP.NET 1.1 auszublenden, sehr nahe. Das Wizard-Steuerelement stellt jedoch eine Reihe von <ASP:WizardStep> bereit, die eine beliebige Anzahl untergeordneter Steuerelemente enthalten können. Allerdings muss jedes <ASP:WizardStep> über eine eigene eindeutige ID verfügen, siehe Abbildung 1. Die Steuerungsseite des Assistenten verwaltet die gesamte Navigation, unterstützt lineare und nichtlineare Navigation und bietet vollständige Entwurfszeitunterstützung. Abbildung 2 zeigt die Assistentensteuerung. Die linke Seite ist eine linkbasierte nichtlineare Navigation und die untere rechte Seite ist eine lineare Schaltflächennavigation. Im sich öffnenden Aufgabenmenü sehen Sie nicht nur eine allgemeine Aufgabe, sondern auch eine Liste von Schritten, die das Wechseln zwischen den Schritten zur Entwurfszeit ermöglichen.
Abbildung 2 Assistent in Visual Studio
Alle sichtbaren Elemente des Assistentensteuerelements sind konfigurierbar. Nichtlineare Links können durch Schaltflächen oder Löscheinträge ersetzt werden, und vorherige, nächste und abgeschlossene lineare Navigationselemente können auch in Bildschaltflächen oder Links umgewandelt werden. Tatsächlich können alle Aspekte der Steuerung über Vorlagen konfiguriert werden.
Eine der Schwierigkeiten beim Schreiben von Assistentensteuerelementen in ASP.NET 1.1 bestand darin, zu verwalten, wo sich der Benutzer befinden sollte. Das Assistentensteuerelement vereinfacht diese Aufgabe, indem es die ActiveStep-Eigenschaft verfügbar macht. Die ActiveStep-Eigenschaft kann abfragen und ermitteln, welcher Schritt derzeit aktiv ist. Der natürliche Ablauf des Assistenten erfolgt wie von der Implementierung deklariert und der Ablauf kann jederzeit über die MoveTo-Methode geändert werden. Über MoveTo kann jeder Schritt als ActiveStep festgelegt werden. Um die Navigation und den Prozess zu unterstützen, werden auch mehrere Ereignisse bereitgestellt, siehe Abbildung 3.
Die neue Assistentensteuerung ist sehr nützlich, wenn Sie nicht alle grundlegenden Strukturen in ASP.NET schreiben möchten. ASP.NET hat die ganze Arbeit für Sie erledigt. Das Wizard-Steuerelement ist so nützlich, dass das ast.net-Team es als Basisklasse für das CreateUserWizard-Steuerelement verwendet, das zum Erstellen von Benutzern als Teil der Membership-Funktion verwendet wird.
Die Abschnitte
Seitenübergreifendes Posten und das <ASP:Wizard>-Steuerelement bieten ASP.NET-Entwicklern mehrere neue Optionen zur Steuerung des Navigationsflusses in ihren Anwendungen. Die seitenübergreifende Bereitstellung ist in Situationen nützlich, in denen Sie derzeit Response.Redirect oder Server.Transfer verwenden müssen. Assistentensteuerelemente eignen sich hervorragend zum Erstellen komplexer Datensammlungen, die sowohl eine lineare als auch eine nichtlineare Datensammlung erfordern.
-------------------------------------------------- ------
Abbildung 1 Schritte des Assistenten
<ASP:Wizard runat="server" >
<WizardSteps>
<ASP:WizardStep ID="Step1">
Willkommen!
</ASP:WizardStep>
<ASP:WizardStep ID="Step2">
Wie ist Ihr Name: [TextBox1]
[Schaltfläche1]
</ASP:WizardStep>
<ASP:WizardStep ID="Step3">
Vielen Dank, [TextBox1.Text]!
</ASP:WizardStep>
</WizardSteps>
</ASP:Wizard>
------------------------------ --- ----------
Abbildung 3 Navigationsereignisse
Ereignisbeschreibung | ActiveStepChanged |
---|---|
Wird | ausgelöst, wenn ActiveStep auf einen neuen WizardStep festgelegt wird. |
CancelButtonClick | Wird ausgelöst, wenn auf die Schaltfläche „Abbrechen“ geklickt wird. |
FinishButtonClick | Wird ausgelöst, wenn auf die Schaltfläche „Fertig stellen“ geklickt wird. |
NextButtonClick | Wird ausgelöst, wenn die Schaltfläche als „Weiter“ identifiziert |
Die Schaltfläche wird angeklickt. | |
PreviousButtonClick | Wird ausgelöst, wenn auf die Schaltfläche „Vorherige“ geklickt wird. |
SideBarButtonClick | Wird ausgelöst, wenn auf einen der SideBar-Links oder -Schaltflächen geklickt wird |