2009-01-26 45 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。如果控件的名稱發生更改,此代碼將會中斷。

此代碼將針對任何請求運行,而不僅僅是頁面,而不僅僅是您需要運行的特定頁面。

此代碼應位於母版頁或頁面基類中,您可以通過類型安全的方式訪問該標籤。