Asp.Net Global.asax访问当前请求的Page对象

时间:2009-01-26 17:30:34

标签: c# asp.net global-asax

有没有办法可以从global.asax Application_EndRequest函数中访问页面对象?

我正在尝试在请求结束时设置标签文本,但访问该页面比我想象的要困难。

这是我目前无法正常工作的内容:

protected void Application_BeginRequest(Object sender, EventArgs e)

    {

        Context.Items.Add("Request_Start_Time", DateTime.Now);

    }

    protected void Application_EndRequest(Object sender, EventArgs e)
    {

        TimeSpan tsDuration = DateTime.Now.Subtract((DateTime)Context.Items["Request_Start_Time"]);

        System.Web.UI.Page page = System.Web.HttpContext.Current.Handler as System.Web.UI.Page;
        if (page != null)
        {
            Label label = page.FindControl("lblProcessingTime") as Label;
            if (label != null)
            {
                label.Text = String.Format("Request Processing Time: {0}", tsDuration.ToString());
            }
        }
    }

页面在这里始终为空。

提前致谢。

3 个答案:

答案 0 :(得分:6)

最好只创建一个BasePage类,您的所有页面都应该从该类继承。然后,您可以将代码放在页面的Unload事件中,并且没有问题。

答案 1 :(得分:0)

您无法在Application_Start和Application_End中执行此操作。

来自MSDN:

Application_Start和Application_End方法是不代表HttpApplication事件的特殊方法。 ASP.NET在应用程序域的生命周期内调用它们一次,而不是为每个HttpApplication实例调用它们。

http://msdn.microsoft.com/en-us/library/ms178473.aspx

答案 2 :(得分:0)

在请求生命周期的这个阶段,页面已经被渲染,页面对象不再可用。您需要使用较早的事件。

那就是说,我不会推荐这种方法,因为它有很多问题:

您正在使用FindControl。如果控件的名称发生更改,此代码将中断。

此代码将针对任何请求运行,而不仅仅是页面,而不仅仅是您需要运行的特定页面。

此代码应位于母版页或页面基类中,您可以以类型安全的方式访问标签。