跨页面回发, 无循环引用错误
强类型跨页面发布。
引言
事情一开始很简单。我只想在一个网站的管理部分使用跨页面回发在两个页面之间传递单个变量。如果不是因为使用了母版页,我根本不会写这篇文章。如果没有母版页,你只需要找到控件即可。但是,使用母版页后,事情就变得复杂了。我不多说了,你只需要通过`clientID`找到控件,并且你需要以我认为容易出错的方式获取该ID。因此,我选择了上一个页面的强类型。这又给我带来了另一个问题。它单向工作得很好,但双向不行。从`x.aspx`到`y.aspx` - 没问题,但从`y.aspx`回到`x.aspx` - 出错了!好吧,我花了一段时间才弄清楚如何干净地做到这一点;一句话:接口。
让我们首先回顾跨页面回发的三种方法。我需要在两个页面`x.aspx`和`y.aspx`之间传递两个变量`iItemID`和`iClientID`。
PreviousPage.FindControl("lbl_iItemID")
,其中`lbl_iItemID`是前一个页面上具有您想要获取的值的`Label`。这在我的母版页上给我带来了问题,需要一些冗长且混乱的代码。至少在我使用的方式上很混乱!- 上一个页面的强类型。在这里,您在接收页面中添加
<%@ PreviousPageType VirtualPath="sourcepage.aspx" %>
。这是对前一个页面的引用,因此您可以直接使用PreviousPage.lbl_iItemID.Text
获取值。这里的问题是,当您尝试返回到第一页时,会收到一个错误,指出循环引用。换句话说,从x到y可以,但从y到x会出错。 - 这种方法不常见,但它应该成为常见方法!使用接口。从现在开始,我将对所有跨页面回发都使用这种方法。它允许您创建数量确定的强类型参数,这些参数可以被任何需要接收或传递变量的页面引用。
接口方法
我将概述我认为应该如何操作
- 创建接口。这个很简单,只有两项。
- 通过添加`ICommonPostBack`来引用您这两个页面中的接口。
- 创建属性。
- 在每个页面上创建一个按钮,并将回发 URL 设置为另一个页面。
- 创建一个`Button_Click`事件,如下所示(假设这是`x.aspx`)。您在此处设置要在接收页面中引用的值。
- 在另一个页面上执行相同的操作,但更改变量以显示已发生发布。请参阅附加的代码(使用 ASP.NET 和 C# 3.5)。
- 请注意,对于母版页,操作方式相同,只是您需要引用`PreviousPage.Master`,或者如果嵌套,则引用母版页的`PreviousPage.Master.Master`。
using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.ComponentModel;
public interface ICommonPostback
{
int IItemID
{ get; set; }
int IClientUploadID
{ get; set; }
}
另存为`ICommonPostback.cs`。
public partial class Admin_y : System.Web.UI.Page, ICommonPostback //(for y)
public partial class Admin_x : System.Web.UI.Page, ICommonPostback //(for x)
#region Cross page postback var
private int iItemID = -1;
private int iClientUploadID = -1;
public int IItemID
{
get { return iItemID; }
set { iItemID = value; }
}
public int IClientUploadID
{
get { return iClientUploadID; }
set { iClientUploadID = value; }
}
#endregion
这可能不是必需的,但我认为为了获得参与发布周期的所有页面的更简洁的代码,这是值得的努力。
<asp:Button ID="Button1" runat="server" Text="Button"
onclick="Button1_Click" PostBackUrl="~/Admin/y.aspx" />
protected void Button1_Click(object sender, EventArgs e)
{
iItemID = 22;
iClientUploadID = 23;
}
在接收页面(假设这是`y.aspx`)上。
protected void Page_Load(object sender, EventArgs e)
{
if (PreviousPage != null)
{
ICommonPostback frm = PreviousPage as ICommonPostback;
Label1.Text = frm.IItemID.ToString();
}
}