ASP.NET 页面间数据传递的探索

ASP.NET开发中,经常需要在不同页面间传递数据。通常,通过查询字符串或者Session来实现。但是,ASP.NET还提供了一种更为直接的方法——跨页面回发(Cross-Page PostBack)。本文将探讨如何使用跨页面回发来传递数据。

跨页面回发(Cross-Page PostBack)简介

跨页面回发是一种在不同页面之间传递数据的技术。它允许将一个页面的数据发送到另一个页面,而不仅仅是发送到当前页面。这种方式在ASP.NET 2.0中被引入。

ASP.NET中,Page类有一个IsCrossPagePostBack属性,它用于判断当前页面是否是通过跨页面回发加载的。默认情况下,这个属性的值为false。但是,如果通过跨页面回发的方式加载页面,这个属性的值就会变为true

要实现跨页面回发,需要在触发回发的控件上设置PostBackUrl属性。这个属性指定了回发的目标页面的URL。ASP.NET会自动处理跨页面回发的过程,只需要指定目标页面即可。

示例:跨页面回发的实现

为了更好地理解跨页面回发的实现方式,来看一个简单的示例。假设有两个页面:FirstPage.aspxSecondPage.aspx。目标是在FirstPage.aspx页面上收集数据,然后将这些数据传递到SecondPage.aspx页面。

FirstPage.aspx页面上,有一个用户控件SimpleCalculator.ascx,它包含两个文本框、几个按钮和一个标签。用户可以在文本框中输入数据,然后点击按钮进行简单的算术运算。

下面是FirstPage.aspx页面的HTML代码:

<form id="form1" runat="server"> <div> <uc1:SimpleCalculator ID="ucSimpleCalculator" runat="server" /> <asp:Label ID="lblHello" runat="server" Text="Say Hello"></asp:Label> <asp:Button ID="Button1" runat="server" Text="Cross Page Post Back" PostBackUrl="~/SecondPage.aspx" /> </div> </form>

FirstPage.aspx页面的代码后台中,不需要编写任何代码。

在用户控件SimpleCalculator.ascx中,定义了两个文本框、几个按钮和一个标签。用户可以通过点击按钮来执行简单的算术运算。

下面是SimpleCalculator.ascx的HTML代码:

<table> <tr> <td> <asp:TextBox ID="op1" runat="server"></asp:TextBox> </td> <td> <asp:TextBox ID="op2" runat="server"></asp:TextBox> </td> </tr> <tr> <td align="right"> <asp:Button ID="btnAdd" runat="server" Text="+" onclick="btnAdd_Click" /> <asp:Button ID="btnSubstract" runat="server" Text="-" onclick="btnSubstract_Click" /> <asp:Button ID="btnMultiplication" runat="server" Text="*" onclick="btnMultiplication_Click" /> <asp:Button ID="btnDivision" runat="server" Text="/" onclick="btnDivision_Click" /> </td> </tr> <tr> <td colspan="2" align="center"> <asp:Label ID="lblResult" runat="server" Text="Result"></asp:Label> </td> </tr> </table>

在用户控件的代码后台中,实现了按钮的点击事件,并显示计算结果。

SecondPage.aspx页面上,想要获取FirstPage.aspx页面上的数据。可以通过Page.PreviousPage属性来访问前一个页面的对象。

下面是SecondPage.aspx页面的HTML代码:

<form id="form1" runat="server"> <div> <asp:Label ID="lblText" runat="server" Text="Result from Previous Page:"></asp:Label> <asp:Label ID="lblSecondResult" runat="server" Text="Label"></asp:Label> </div> </form>

SecondPage.aspx页面的代码后台中,可以通过Page.PreviousPage属性来访问前一个页面的对象,并获取需要的数据。

public partial class SecondPage : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { // Page.PreviousPage returns the Previous Page. // Here checking Previous Page and // IsCrossPagePostBack property of Previous Page if (Page.PreviousPage != null && Page.PreviousPage.IsCrossPagePostBack) { // Here getting the user control of Previous Page var ctrl = Page.PreviousPage.FindControl("ucSimpleCalculator"); // getting op1 textbox of user control var tbop1 = ctrl.FindControl("op1"); // Getting the result label of user control // from Previous Page and assigning the value on this page Label lblResult = (Label)(ctrl.FindControl("lblResult")); lblSecondResult.Text = lblResult.Text; // Similarly we can find any other control // of the previous page : Say to get the Hello label here Label lblHello = (Label)Page.PreviousPage.FindControl("lblHello"); } } }

需要注意的是,在SecondPage.aspx页面上,不能检查当前页面的IsCrossPagePostBack属性,而应该检查前一个页面的IsCrossPagePostBack属性,因为前一个页面发起了跨页面回发。

访问前一个页面的公共属性

如果想要访问前一个页面上的公共属性,可以通过Page.PreviousPage属性来实现。但是,由于Page.PreviousPage返回的对象类型是Object,不能直接访问属性。需要一个强类型的前一个页面的对象。

可以通过在SecondPage.aspx页面的ASPX文件中添加一个指令来实现这一点:

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

添加这个指令后,Page.PreviousPage将返回一个强类型的前一个页面的对象,可以直接访问其属性。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485