Mit ASP war es lange Zeit üblich für die Ereignisbehandlung auf eine zweite Seite zuzugreifen. Dies z.B. um eine unverselle Formularbehandlung für alle Eingabeseiten zu bauen. Mit ASP .NET ist dies jetzt auf den ersten Blick nicht mehr möglich, da entweder in der gleichen Seite oder in der gleichnamigen Codebehind Seite gearbeitet werden muss. Es geht aber doch!
Zunächst legen wir eine normale ASP Seite mit dem Namen "First" an. Auf dieser platzieren wir einen Tetxbox (txtName) und einen Button.
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="first.aspx.vb" Inherits="tonershop.first"%> <HTML> <HEAD> <title>first</title> </HEAD> <body > <form id="Form1" method="post" runat="server"> <asp:TextBox id="txtName" runat="server"></asp:TextBox> <asp:Button id="cmdButton" runat="server" Text="Button"></asp:Button> </form> </body> </HTML> |
In der gleichnamigen Codebehind Seite wird dann der Eventhandler eingebaut, die per Server.Transfer die bearbeitung an eine zweite Seite übergibt. Damit beliebt der Title im Browserfenster für den Benutzer der gleiche (first.aspx)
Um das Textbox Control aber überhaupt auf der zweiten Seite verfügbar zu machen, gibt es zwei Möglichkeiten.
1. Statt protected die textbox mit Public deklaraieren
2. ein Proberty einbauen
Die zweite Methode implementiert die Eigenschaft TextFeld, die wiederum nur lesend den Text der Textbox zurückliefert.
Public Class first Inherits System.Web.UI.Page Protected WithEvents cmdButton As System.Web.UI.WebControls.Button Protected WithEvents txtName As System.Web.UI.WebControls.TextBox Public ReadOnly Property TextFeld() As String Get Return txtName.Text End Get End Property Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load End Sub Private Sub cmdButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdButton.Click Server.Transfer("second.aspx") End Sub End Class |
Die zweite Seite (second.aspx) enthält auf der HTMl Seite nichts nenneswertes. Laut Doku sollte allerdings die Direktive Reference Page auf die Ursprungsseite gesetzt werden. Die Begründung ist, das damit die ursprungseite dynamisch mitkompiliert und gelinkt wird.
In meinen Test funktionierte es allerdings auch ohne.
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="second.aspx.vb" Inherits="tonershop.second"%> <%@ Reference Page="first.aspx" %> <html> <head> <title>second</title> </head> <body> <form id="Form1" method="post" runat="server"> </form> </body> </html> |
Nun müssen wir nur noch die Eventbehandlung auf der zweiten Seite durchführen. Dazu wird eine tVariable fp mit der Klasse first (name der ersten Seite) deklariert. Anschliessend wird diese zugewiesen indem aus dem aktuellen Context der Handler in die First Klasse gecastet wird.
Dadurch erhalten Sie über das Objekt fp nun vollen Zugriff auf den Inhalt der Klasse first aus der ersten Seite und können z.B. per Response.Write den Inhalt ausgeben.
Public Class second Inherits System.Web.UI.Page Public fp As first Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load If Not IsPostBack Then fp = CType(Context.Handler, first) Response.Write(fp.TextFeld) End If End Sub End Class |
Anhand dieses Beispieles erfährt man ein bischen mehr über die Möglichkeiten und arbeitsweise von ASP .NET . Eine wirkliche Anwendung erscheint aber wenig sinnvoll. Muster ohne Wert.