在事件处理程序中执行跨页发布





5.00/5 (1投票)
本文介绍了一种 ASP.NET 页面跳转方法,该方法可以像 Response.Redirect 方法一样调用,并执行跨页面提交。
目录
介绍
本文介绍了一种 ASP.NET 页面跳转方法,该方法可以像 Response.Redirect
方法一样调用,并执行跨页面提交。
当我开发 ASP.NET 应用程序时,我经常使用跨页面提交来传输页面数据到另一个页面。跨页面提交的优点是,被传输的页面可以访问上一个页面以检索页面数据。它减少了会话管理的开销。因此,我更喜欢使用跨页面提交。
但是,我有一个不喜欢跨页面提交的地方;它不能在事件处理程序中执行。 当我们设置 Button.PostBackUrl
属性来执行跨页面提交时,不幸的是,点击事件处理程序不起作用。 因此,如果我们想在事件处理程序中做一些事情之后跳转到另一个页面,我们就不能使用跨页面提交。
因此,当我们使用跨页面提交时,我们必须使用几种实现技术。在某些情况下,我们必须设置 PostBackUrl
属性来执行跨页面提交。而在其他情况下,我们必须实现一个事件处理程序,以便在做了一些事情之后使用 Response.Redirect
方法跳转到另一个页面(尽管也可以使用 HttpServerUtility.Transfer
方法,但我不希望使用它)。此外,然后,我们必须使用会话或查询字符串将数据传递到另一个页面。
因此,页面跳转和数据传递的实现变得复杂。
为了减轻这种复杂性,我提出了一个在事件处理程序中执行跨页面提交的机制。它始终允许我们使用跨页面提交来跳转并传递数据到另一个页面。
概念
我的想法的概念如图 1 所示。
以下是我的想法的主要点:
- 使用异步回发请求服务器
- 将跨页面提交脚本作为异步回发的响应返回
- 评估返回的脚本
- 使用
PreviousPage
属性检索上一个页面数据
1. 使用异步回发请求服务器
当异步回发完成时,将引发 ScriptManager.endRequest
事件。因此,此事件允许您在异步回发完成后在客户端执行其他进程。
2. 将跨页面提交脚本作为异步回发的响应返回
ClientScriptManager.GetPostBackEventReference
方法允许您在服务器端事件处理程序中创建跨页面提交脚本。当您传递一个适当设置的 PostBackOption
类的实例时,此方法将返回一个跨页面提交脚本作为 string
。
ScriptManger.RegisterDataItem
方法可用于将创建的脚本作为响应返回。此方法允许您将任何数据存储在 dataItems
数组中。并且,可以在 endRequest
事件处理程序中访问 dataItems
数组。
3. 评估返回的脚本
在 endRequest
事件处理程序中,您可以通过 dataItems
数组检索返回的跨页面提交脚本。当您将其脚本传递给 eval
方法时,就会执行跨页面提交。
4. 使用 PreviousPage 属性检索上一个页面数据
与正常的跨页面提交一样,可以使用 PreviousPage
属性从下一个页面访问上一个页面数据。当然,PreviousPageType
指令也有效。
实现示例
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="scriptManager" runat="server" />
<asp:UpdatePanel ID="updatePanel" runat="server">
<ContentTemplate>
<asp:Button ID="submitButton" runat="server"
Text="Submit" OnClick="Submit" />
</ContentTemplate>
</asp:UpdatePanel>
</form>
</body>
using System;
using System.Text;
using System.Web;
using System.Web.UI;
namespace SampleCode
{
public partial class Page1 : Page
{
public string OrderNo
{
get
{
return (string)ViewState["OrderNo"];
}
private set
{
ViewState["OrderNo"] = value;
}
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
StringBuilder script = new StringBuilder();
script.Append("var manager =
Sys.WebForms.PageRequestManager.getInstance();");
script.Append("manager.add_endRequest(function(sender, args) {");
script.Append(" if (args.get_error() == undefined) {");
script.Append(" var dataItems = args.get_dataItems();");
script.Append(" var item = dataItems['" + ClientID + "'];");
script.Append(" if (item != undefined) {");
script.Append(" eval(item);");
script.Append(" }");
script.Append(" }");
script.Append("});");
ClientScript.RegisterStartupScript(GetType(),
"doCrossPagePostBack", script.ToString(), true);
}
protected void Submit(object sender, EventArgs e)
{
Random r = new Random();
OrderNo = String.Format("OD{0:00000000}", r.Next(0, 99999999));
NavigateTo("~/Page2.aspx");
}
private void NavigateTo(string url)
{
ScriptManager manager = ScriptManager.GetCurrent(this);
if (manager.IsInAsyncPostBack)
{
if (VirtualPathUtility.IsAbsolute(url) == false)
{
url = VirtualPathUtility.ToAbsolute(url);
}
PostBackOptions o = new PostBackOptions(this, String.Empty, url,
false, false, false, true, false, String.Empty);
manager.RegisterDataItem(this,
ClientScript.GetPostBackEventReference(o));
}
}
}
}
<body>
<form id="form1" runat="server">
<asp:Label ID="orderNoLabel" runat="server" Text="Order No :" />
<asp:Label ID="orderNoValueLabel" runat="server" />
</form>
</body>
using System;
using System.Web.UI;
namespace SampleCode
{
public partial class Page2 : Page
{
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
if (PreviousPage != null && PreviousPage.IsCrossPagePostBack)
{
Page1 previousPage = (Page1)PreviousPage;
this.orderNoValueLabel.Text = previousPage.OrderNo;
}
}
}
}
历史
- 2009-05-06:发布