2009-01-26 11 views
6

¿Hay alguna manera de que pueda acceder al objeto de página desde la función global.asax Application_EndRequest?Asp.Net Acceso global.asax al objeto de página solicitado actual

Estoy tratando de establecer el texto de una etiqueta al final de la solicitud, pero el acceso a la página está resultando ser más difícil de lo que pensaba.

aquí es lo que tengo que actualmente no es de trabajo:

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

página siempre es nulo aquí.

Gracias de antemano.

Respuesta

6

Probablemente sea mejor crear una clase de BasePage de la que heredarán todas sus páginas. Luego puede poner el código dentro del evento Descargar de la página y no habrá problemas.

+0

Esto es realmente una buena idea. Requiere un ajuste al diseño, pero no garantiza un voto negativo, IMO. – casperOne

+0

Gracias. Solo pensé que sería útil señalar otro enfoque, que quizás no se haya notado. – Noldorin

+0

Buena llamada Nolodorin. Creo que esta sería la mejor idea. Incluso mejor sería una página maestra para asegurarse de que la etiqueta siempre esté allí, ya que parece que cada página tendría la misma etiqueta. –

0

No puede hacer esto en Application_Start y Application_End.

De MSDN:

Los métodos Application_Start y Application_End son métodos especiales que no representan eventos HttpApplication. ASP.NET los llama una vez durante la vigencia del dominio de la aplicación, no para cada instancia de HttpApplication.

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

+2

este no es el Application_Start o Application_End, es Application_StartRequest y Application_EndRequest. –

1

En esta etapa del ciclo de vida de la solicitud de la página ya se ha prestado y el objeto de página ya no está disponible. Necesitarías usar un evento anterior.

Dicho esto, yo no recomendaría este enfoque, ya que hay una serie de problemas con él:

está usando el FindControl. Este código se romperá si el nombre del control cambia.

Este código se ejecutará para cualquier solicitud, no solo las páginas y no solo las páginas particulares para las que necesita que esto se ejecute.

Este código debe estar en una página maestra o una clase base de página donde puede acceder a la etiqueta de una manera segura.

+0

FindControl no se romperá si no se encuentra, la etiqueta será nula. –

+1

Sí, la etiqueta será nula, la funcionalidad se romperá. Aborrezco el uso de FindControl. En el 99% de los casos se usa debido a un diseño deficiente. Casi siempre habrá una manera de declarar una instancia fuertemente tipada del control que está tratando de encontrar. –

Cuestiones relacionadas