¿Obtener System.Web.UI.Page actual de HttpContext?

84

Esta es en realidad una pregunta de dos partes. Primero, ¿HttpContext.Current corresponde al objeto System.UI.Page actual?

Y la segunda pregunta, que probablemente esté relacionada con la primera, es por qué no puedo usar lo siguiente para ver si la página actual implementa una interfaz:

private IWebBase FindWebBase()
{
    if (HttpContext.Current as IWebBase != null)
    {
        return (IWebBase)HttpContext.Current.;
    }
    throw new NotImplementedException("Crawling for IWebBase not implemented yet");
}

El contexto general es que algunos controles necesitan saber si se están ejecutando como un elemento web de SharePoint o como parte de un marco Asp.Net.

Resolví el problema requiriendo que el control pase una referencia a sí mismo y verificando la propiedad Page del control, pero todavía tengo curiosidad por saber por qué lo anterior no funciona.

El error del compilador es: No se puede convertir System.Web.HttpContext a ... IWebBase mediante una conversión de referencia, conversión de caja, conversión de caja, conversión de envoltura o conversión de tipo nulo.

tsimon
fuente

Respuestas:

144

No, de MSDN en HttpContext.Current: "Obtiene o establece el objeto HttpContext para la solicitud HTTP actual".

En otras palabras, es un objeto HttpContext, no una página.

Puede acceder al objeto Page a través de HttpContext usando:

Page page = HttpContext.Current.Handler as Page;

if (page != null)
{
     // Use page instance.
}
Ceniza
fuente
2
Votado en contra porque es incorrecto. ¡La respuesta con HttpContext.Current.CurrentHandler es correcta! Si hace un Server.Transfer, HttpContext.Current.Handler SERÁ LA PÁGINA ANTERIOR, HttpContext.Current.CurrentHandler SERÁ LA PÁGINA ACTUAL
Mike
37

Estás buscando HttpContext.Handler. Dado que Page implementa IHttpHandler, obtendrás una referencia a la página que se está ejecutando actualmente. Tendrás que convertirla, o al menos intentar convertirla al tipo particular que estás buscando.

HttpContext.Currentsimplemente devuelve la instancia singleton de HttpContext. Por tanto, no es ni puede ser nunca una página.

Kilhoffer
fuente
2
Solo una nota para cualquiera que lea esto. La respuesta a continuación es la misma pero con un ejemplo (es decir, usa HttpContext.Current.Handler).
mike nelson
15

Es posible que desee utilizar HttpContext.Current.CurrentHandlersi desea la página precisa que se está ejecutando actualmente. Por ejemplo, se envía una solicitud para Default.aspx, pero se Response.Transfergenera un error y usted realiza una en su página personalizada ErrorHandler.aspx. CurrentHandlerdevolverá la instancia de ErrorHandler.aspx (si se llama después del error) mientras HttpContext.Current.Handlerque devolvería una instancia de Default.aspx.

usuario452427
fuente
0

Consulte mi respuesta:
¿Por qué HttpContext.Current.Handler es nulo?

Quizás resolvió tu problema.

Amin Ghaderi
fuente
Estoy usando el mismo código para mi trabajo, pero estaba muy molesto porque no estaba al tanto de los detalles del trabajo. Así que desarrollé este código para mi trabajo. Pensé que Ponga el código aquí para ayudar a los amigos que tienen mi problema. Gracias a John Saunders.
Amin Ghaderi