2009-01-26 11 views
6

Gibt es eine Möglichkeit, auf das Seitenobjekt innerhalb der global.asax Application_EndRequest-Funktion zuzugreifen?Asp.Net Global.asax Zugriff auf das aktuell angeforderte Seitenobjekt

Ich versuche, den Text eines Etiketts am Ende der Anfrage festzulegen, aber der Zugriff auf die Seite erweist sich als schwieriger als ich dachte.

hier ist das, was ich habe das ist zur Zeit nicht arbeiten:

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

Seite ist hier immer null.

Vielen Dank im Voraus.

Antwort

6

Es ist wahrscheinlich am besten, nur eine BasePage-Klasse zu erstellen, von der alle Ihre Seiten erben sollten. Dann können Sie den Code in das Unload-Ereignis der Seite einfügen und es wird kein Problem geben.

+0

Das ist eigentlich eine gute Idee. Es erfordert eine Anpassung an das Design, aber es garantiert keine negative Stimme, IMO. – casperOne

+0

Danke. Ich dachte nur, es wäre hilfreich, auf einen anderen Ansatz hinzuweisen, der vielleicht nicht bemerkt wurde. – Noldorin

+0

Guten Ruf Nolodorin. Ich denke, das wäre die beste Idee. Noch besser wäre eine Masterseite, um sicherzustellen, dass das Label immer da ist, da es sich anhört, als hätte jede Seite das gleiche Label. –

0

Sie können dies nicht in Application_Start und Application_End tun.

Von MSDN:

Die Application_Start und Application_End Methoden sind spezielle Methoden, die Httpapplication Ereignisse nicht vertreten. ASP.NET ruft sie einmal für die Lebensdauer der Anwendungsdomäne und nicht für jede HttpApplication-Instanz auf.

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

+2

Dies ist nicht der Application_Start oder Application_End, sondern Application_StartRequest und Application_EndRequest. –

1

In diesem Stadium des Lebenszyklus des Antrags hat die Seite bereits und die Seite Objekt gemacht worden ist leider nicht mehr verfügbar. Sie müssten ein früheres Ereignis verwenden.

Das heißt, ich würde diesen Ansatz nicht empfehlen, da es eine Reihe von Problemen mit sich sind:

Sie Findcontrol verwenden. Dieser Code wird beschädigt, wenn sich der Name des Steuerelements ändert.

Dieser Code wird für jede Anfrage ausgeführt, nicht nur für Seiten und nicht nur für bestimmte Seiten, für die Sie diese benötigen.

Dieser Code sollte in einer Masterseite oder einer Seitenbasisklasse enthalten sein, wo Sie typsicher auf das Label zugreifen können.

+0

FindControl wird nicht brechen, wenn nicht gefunden, die Beschriftung wird nur Null sein. –

+1

Ja, das Label wird null, die Funktionalität wird unterbrochen. Ich verabscheue die Verwendung von FindControl. In 99% der Fälle wird es wegen schlechter Konstruktion verwendet. Es gibt fast immer eine Möglichkeit, eine stark typisierte Instanz des Steuerelements zu deklarieren, das Sie suchen. –

Verwandte Themen