65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2009年5月5日

CPOL

3分钟阅读

viewsIcon

25759

本文介绍了一种 ASP.NET 页面跳转方法,该方法可以像 Response.Redirect 方法一样调用,并执行跨页面提交。

目录 

介绍 

本文介绍了一种 ASP.NET 页面跳转方法,该方法可以像 Response.Redirect 方法一样调用,并执行跨页面提交。   

当我开发 ASP.NET 应用程序时,我经常使用跨页面提交来传输页面数据到另一个页面。跨页面提交的优点是,被传输的页面可以访问上一个页面以检索页面数据。它减少了会话管理的开销。因此,我更喜欢使用跨页面提交。  

但是,我有一个不喜欢跨页面提交的地方;它不能在事件处理程序中执行。 当我们设置 Button.PostBackUrl 属性来执行跨页面提交时,不幸的是,点击事件处理程序不起作用。 因此,如果我们想在事件处理程序中做一些事情之后跳转到另一个页面,我们就不能使用跨页面提交。  

因此,当我们使用跨页面提交时,我们必须使用几种实现技术。在某些情况下,我们必须设置 PostBackUrl 属性来执行跨页面提交。而在其他情况下,我们必须实现一个事件处理程序,以便在做了一些事情之后使用 Response.Redirect 方法跳转到另一个页面(尽管也可以使用 HttpServerUtility.Transfer 方法,但我不希望使用它)。此外,然后,我们必须使用会话或查询字符串将数据传递到另一个页面。

因此,页面跳转和数据传递的实现变得复杂。

为了减轻这种复杂性,我提出了一个在事件处理程序中执行跨页面提交的机制。它始终允许我们使用跨页面提交来跳转并传递数据到另一个页面。  

概念

我的想法的概念如图 1 所示。

concept2.png

图 1. 我的想法的概念。

以下是我的想法的主要点:  

  1. 使用异步回发请求服务器
  2. 将跨页面提交脚本作为异步回发的响应返回 
  3. 评估返回的脚本
  4. 使用 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>
代码 1. Page1.aspx 的一部分
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));
            }
        }
    }
}
代码 2. Page1.aspx.cs
<body>
    <form id="form1" runat="server">
    <asp:Label ID="orderNoLabel" runat="server" Text="Order No :" />
    <asp:Label ID="orderNoValueLabel" runat="server" />
    </form>
</body> 
代码 3. Page2.aspx 的一部分
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;
            }
        }
    }
}
代码 4. Page2.aspx.cs

历史 

  • 2009-05-06:发布
© . All rights reserved.