Seitenübergreifendes Senden in ASP.NET-Webseiten

Aktualisiert: November 2007

Schaltflächen und andere Steuerelemente, die ein Postback auf einer ASP.NET-Webseite auslösen, übermitteln die Seite standardmäßig an sich selbst zurück. Dies ist Teil des Schleifenzyklus, den ASP.NET-Webseiten im Rahmen ihrer normalen Verarbeitung durchlaufen. Ausführliche Informationen finden Sie unter Einführung in ASP.NET-Webseiten.

In einigen Situationen ist es sinnvoll, eine Seite an eine andere Seite zu senden. Zum Beispiel können Sie ein mehrseitiges Formular erstellen, das auf jeder Seite unterschiedliche Informationen sammelt. In diesem Fall können Sie bestimmte Steuerelemente (die die IButtonControl-Schnittstelle implementieren, z. B. das Button-Steuerelement) auf der Seite so konfigurieren, dass sie an eine andere Zielseite senden. Dies wird als seitenübergreifendes Senden von Daten bezeichnet. Das seitenübergreifende Senden von Daten hat beim Umleiten zu einer anderen Seite gegenüber der Transfer-Methode einige Vorteile. Ausführliche Informationen finden Sie unter Umleiten von Benutzern auf eine andere Seite.

Hinweis:

Sie können auch das Wizard-Steuerelement verwenden, um Formulare mit mehreren Ansichten zu erstellen. Ausführliche Informationen finden Sie unter Übersicht über das Wizard-Webserversteuerelement.

Da das seitenübergreifende Senden von Daten für einzelne Steuerelemente konfiguriert wird, können Sie eine Seite erstellen, die an unterschiedliche Seiten sendet, je nachdem, auf welche Schaltfläche der Benutzer klickt.

Abrufen von Informationen von der Quellseite

Wenn Sie eine Seite für seitenübergreifendes Senden von Daten konfigurieren, müssen Sie häufig Informationen von der Quellseite abrufen. Dazu gehören die Informationen von den Steuerelementen auf der Seite – das sind die Informationen, die vom Browser gesendet werden – sowie die öffentlichen Eigenschaften der Ausgangsseite.

Abrufen von Steuerelementwerten

Die Page-Klasse macht eine Eigenschaft mit dem Namen PreviousPage verfügbar. Wenn sich die Quellseite und die Zielseite in derselben ASP.NET-Anwendung befinden, enthält die PreviousPage-Eigenschaft in der Zielseite einen Verweis auf die Quellseite. (Die PreviousPage-Eigenschaft wird nicht initialisiert, wenn die Seite nicht das Ziel des seitenübergreifenden Sendens von Daten ist oder wenn sich die Seiten in verschiedenen Anwendungen befinden.) Standardmäßig wird die PreviousPage-Eigenschaft als Page eingegeben.

Hinweis:

Wenn sich die Quellseite und die Zielseite in unterschiedlichen Anwendungen befinden, können Sie die Steuerelementwerte nicht direkt von der Seite abrufen. Sie können aber die gesendeten Daten in dem Form-Wörterbuch lesen. Sie können den Ansichtszustand auf der Quellseite nicht lesen, da diese mit Hash versehen ist. Falls Sie die Werte auf der Quellseite speichern und auf der Zielseite verfügbar machen möchten, können Sie die Werte als Zeichenfolgen in ausgeblendeten Feldern auf der Quellseite speichern und sie mithilfe von Request.Form auf der Zielseite abrufen.

Über den Verweis in der PreviousPage-Eigenschaft können Sie nach Steuerelementen auf der Quellseite suchen und ihren Wert extrahieren. Sie verwenden dazu in der Regel die FindControl-Methode.

Hinweis:

Wenn Sie die Quellseite speziell so programmieren, dass eine gemeinsame Nutzung von Informationen mit Zielseiten möglich ist, können Sie auf einfache Weise die Steuerelementwerte den Zielseiten zur Verfügung stellen, indem die Werte als öffentliche Eigenschaften verfügbar gemacht werden. Ausführliche Informationen finden Sie nachfolgend in diesem Thema unter Abrufen öffentlicher Eigenschaftenwerte von der Quellseite.

Im folgenden Codebeispiel wird veranschaulicht, wie Sie den Wert des TextBox1-Steuerelements auf der Quellseite abrufen können.

If Not Page.PreviousPage Is Nothing Then
    Dim SourceTextBox As TextBox
    SourceTextBox = CType(PreviousPage.FindControl("TextBox1"), _
        TextBox)
    If Not SourceTextBox Is Nothing Then
        Label1.Text = SourceTextBox.Text
    End If
End If
if (Page.PreviousPage != null)
{
    TextBox SourceTextBox = 
        (TextBox)Page.PreviousPage.FindControl("TextBox1");
    if (SourceTextBox != null)
    {
        Label1.Text = SourceTextBox.Text;
    }
}

Die FindControl-Methode sucht Steuerelemente im aktuellen Namenscontainer. Wenn das von Ihnen gesuchte Steuerelement in einem anderen Steuerelement enthalten ist (typischerweise in einer Vorlage), benötigen Sie zuerst einen Verweis auf den Container. Dann können Sie den Container nach dem gewünschten Steuerelement durchsuchen. Im folgenden Codebeispiel enthält die Quellseite ein Login-Steuerelement mit einem LayoutTemplate-Container, der wiederum ein TextBox-Steuerelement mit dem Namen UserName enthält. Der Code ruft den Wert des UserName-Steuerelements ab.

Dim LoginControl As Login
LoginControl = CType(PreviousPage.FindControl("Login1"), Login)
If Not LoginControl Is Nothing Then
    Dim UserName As TextBox
    UserName = CType(LoginControl.FindControl("UserName"), TextBox)
    If Not UserName Is Nothing Then
        Label1.Text = UserName.Text
    End If
Else
    Label1.Text = "Cannot find user name in Login control."
End If
Login LoginControl = (Login)PreviousPage.FindControl("Login1");
if (LoginControl != null)
{
    TextBox UserName = (TextBox)LoginControl.FindControl("UserName");
    if (UserName != null)
    {
        Label1.Text = UserName.Text;
    }
}
else
{
    Label1.Text = "Cannot find user name in Login control.";
}

Abrufen öffentlicher Eigenschaftenwerte von der Quellseite

Beim seitenübergreifenden Senden von Daten können Sie auf der Zielseite auch die Werte von den öffentlichen Membern der Quellseite abrufen. Das häufigste Szenario ist, dass die Quellseite die öffentlichen Eigenschaften definiert und Sie die Werte der Quellseite auf der Zielseite abrufen möchten.

Sicherheitshinweis:

Es wird empfohlen, dass Sie nur die Informationen verfügbar machen, die Sie als öffentliche Eigenschaften benötigen. Dadurch wird die Informationsmenge reduziert, die potenziell böswilligen Benutzern zur Verfügung steht.

Um öffentliche Member der Quellseite abzurufen, müssen Sie zuerst einen stark typisierten Verweis auf die Quellseite aufrufen.

Dies kann auf verschiedene Arten erreicht werden. Zum einen kann eine @ PreviousPageType-Direktive in die Zielseite integriert werden, mit der Sie wie im folgenden Beispiel die Quelldatei angeben können:

<%@ PreviousPageType VirtualPath="~/SourcePage.aspx" %> 

Wenn diese Direktive integriert ist, hat die PreviousPage-Eigenschaft eine starke Typbindung an die Klasse der Quellseite, auf die verwiesen wird. Folglich können Sie auf öffentliche Member der Quellseite direkt verweisen. Sie können den Quellseitentyp entweder direkt angeben, indem Sie das type-Attribut verwenden, oder indirekt, indem Sie explizit in einem VirtualPath-Attribut auf die Quellseite verweisen, wie das Beispiel zeigt.

Im folgenden Codebeispiel wird ein Teil einer Quellseite gezeigt, die eine öffentliche Eigenschaft mit dem Namen CurrentCity enthält. Diese Eigenschaft macht den Wert eines TextBox-Steuerelements mit dem Namen textCity verfügbar.

Public ReadOnly Property CurrentCity() As String
    Get
        Return textCity.Text
    End Get
End Property
public String CurrentCity
{
    get
    {
        return textCity.Text;
    }
}
Hinweis:

Die Eigenschaften auf der Quellseite, die in erster Linie erstellt wurden, um Werte für seitenübergreifendes Senden von Daten verfügbar zu machen, sind normalerweise schreibgeschützt. Obwohl die Quellseite öffentliche Eigenschaften mit Lese-/Schreibzugriff enthalten kann, ist es im Allgemeinen nicht sinnvoll, eine Quellseiteneigenschaft über die Zielseiteneigenschaft festzulegen, da der Wert nicht beibehalten wird.

Wenn die Zielseite eine PreviousPageType-Direktive enthält, die auf die Quellseite verweist, können Sie auf die CurrentCity-Eigenschaft der Quellseite zugreifen, indem Sie Code wie den folgenden verwenden.

Label1.Text = PreviousPage.CurrentCity;
Label1.Text = PreviousPage.CurrentCity;

Um einen stark typisierten Verweis auf die Quellseite zu erhalten, können Sie auch eine @ Reference-Direktive in die Zielseite integrieren, die auf die Quellseite verweist, ebenso wie Sie auf jeden Typ verweisen würden, den Sie auf Ihrer Seite verwenden möchten. In diesem Fall können Sie von der Zielseite die PreviousPage-Eigenschaft der Zielseite abrufen und sie in den Quellseitentyp umwandeln, indem Sie Code wie den folgenden verwenden.

Dim sourcePage As SourcePage_aspx
sourcePage = CType(PreviousPage, SourcePage_aspx)
Label1.Text = p.CurrentCity
SourcePage_aspx sourcePage;
sourcePage = (SourcePage_aspx) PreviousPage;
Label1.Text = sourcePage.CurrentCity;

Überprüfen von Postbacks in der Zielseite

Während eines seitenübergreifenden Postbacks wird der Inhalt der Quellseitensteuerelemente zur Zielseite gesendet, und der Browser führt eine HTTP-POST-Operation aus (keine GET-Operation). Auf der Zielseite jedoch ist die IsPostBack-Eigenschaft sofort nach einer seitenübergreifenden Sendung false. Obwohl das seitenübergreifende Senden das gleiche Verhalten wie eine POST-Operation aufweist, ist das seitenübergreifende Senden kein Postback zur Zielseite. Deshalb wird IsPostBack auf false festgelegt, und die Zielseite kann ihren Code zum ersten Mal durchlaufen.

Wenn es für Ihre Anwendung nützlich ist, können Sie bestimmen, ob die Zielseite als Ergebnis eines seitenübergreifenden Sendens ausgeführt werden soll. Dazu können Sie die IsCrossPagePostBack-Eigenschaft des Seitenverweises testen, die von der PreviousPage-Eigenschaft der Zielseite zurückgegeben wird (siehe nachfolgendes Codebeispiel).

If PreviousPage IsNot Nothing Then
    If PreviousPage.IsCrossPagePostBack = True Then
         Label1.Text = "Cross-page post."
    End If
Else
    Label1.Text = "Not a cross-page post."
End If
if(PreviousPage != null)
{
    if(PreviousPage.IsCrossPagePostBack == true)
    {
         Label1.Text = "Cross-page post.";
    }
}
else
{
    Label1.Text = "Not a cross-page post.";
}

Beachten Sie, dass die PreviousPage-Eigenschaft null zurückgibt (Nothing in Visual Basic), falls die aktuelle Seite nicht das Ziel des seitenübergreifenden Sendens ist.

Weitere Informationen finden Sie unter Gewusst wie: Ermitteln des Aufrufverfahrens einer ASP.NET-Webseite.

Seitenübergreifendes Senden im Vergleich zu Server.Transfer

Die PreviousPage-Eigenschaft und die PreviousPageType-Direktive sind in zwei Situationen nützlich: beim Aufrufen der Zielseite in einem seitenübergreifenden Postback (einem clientbasierten Transfer) und bei der Transfer-Methode (einem serverbasierten Vorgang). Bei beiden Operationen kann der Code in der Zielseite mithilfe der PreviousPage-Eigenschaft einen Verweis auf die Quellseite abrufen.

Es kann auf der Zielseite unter Umständen wichtig sein festzustellen, ob die Zielseite durch ein seitenübergreifendes Senden oder durch eine Server.Transfer-Operation aufgerufen wurde. Damit Sie das leichter feststellen können, macht die Page-Klasse eine Eigenschaft mit dem Namen IsCrossPagePostBack verfügbar. Ausführliche Informationen finden Sie unter Gewusst wie: Ermitteln des Aufrufverfahrens einer ASP.NET-Webseite.

Siehe auch

Aufgaben

Gewusst wie: Senden von ASP.NET-Webseiten an eine andere Seite

Gewusst wie: Ermitteln des Aufrufverfahrens einer ASP.NET-Webseite