2009-01-26 44 views
6

有没有什么办法可以从global.asax Application_EndRequest函数中访问页面对象?Asp.Net Global.asax访问当前请求的页面对象

我想在请求结束时设置一个标签的文本,但访问该页面证明比我想象的更困难。

这里是我的影片目前没有工作:

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()); 
      } 
     } 
    } 

页总是空在这里。

在此先感谢。

回答

6

这可能是最好的只是创建一个BasePage类,从中你所有的页面应该继承。然后你可以把代码放在页面的Unload事件中,这样就没有问题了。

+0

这实际上是一个好主意。它确实需要对设计进行调整,但它不保证负面投票,IMO。 – casperOne 2009-01-26 17:44:33

+0

谢谢。我只是认为指出另一种可能没有注意到的方法是有帮助的。 – Noldorin 2009-01-26 18:05:43

+0

好的电话Nolodorin。我认为这将是最好的主意。更好的办法是成为一个母版页,以确保标签始终在那里,因为听起来每个页面都有相同的标签。 – 2009-01-26 18:23:58

0

你不能在Application_Start和Application_End中做到这一点。

从MSDN:

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

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

1

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

尽管如此,因为有一些问题吧,我不会推荐这种方法:

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

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

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