Obter System.Web.UI.Page atual de HttpContext?

85

Na verdade, esta é uma questão de duas partes. Primeiro, o HttpContext.Current corresponde ao objeto System.UI.Page atual?

E a segunda pergunta, que provavelmente está relacionada à primeira, é por que não posso usar o seguinte para ver se a página atual implementa uma interface:

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

O contexto geral é que alguns controles precisam saber se estão sendo executados como uma webpart do SharePoint ou como parte de uma estrutura Asp.Net.

Resolvi o problema exigindo que o controle passasse uma referência para si mesmo e verificando a propriedade Page do controle, mas ainda estou curioso para saber por que o acima não funciona.

O erro do compilador é: Não é possível converter System.Web.HttpContext em ... IWebBase por meio de uma conversão de referência, conversão de boxing, conversão de unboxing, conversão de empacotamento ou conversão de tipo nulo.

tsimon
fonte

Respostas:

144

Não, do MSDN em HttpContext.Current: "Obtém ou define o objeto HttpContext para a solicitação HTTP atual."

Em outras palavras, é um objeto HttpContext, não uma Página.

Você pode chegar ao objeto Página por meio de HttpContext usando:

Page page = HttpContext.Current.Handler as Page;

if (page != null)
{
     // Use page instance.
}
Cinza
fonte
2
Votado para baixo porque incorreto. A resposta com HttpContext.Current.CurrentHandler está correta! Se você fizer um Server.Transfer, HttpContext.Current.Handler SERÁ A PÁGINA ANTERIOR, HttpContext.Current.CurrentHandler SERÁ A PÁGINA ATUAL
mike
37

Você está procurando HttpContext.Handler. Como Page implementa IHttpHandler, você obterá uma referência para a página em execução no momento. Você terá que convertê-la ou pelo menos tentar convertê-la para o tipo específico que está procurando.

HttpContext.Currentsimplesmente retorna a instância singleton de HttpContext. Portanto, não é e nunca pode ser uma página.

Kilhoffer
fonte
2
Apenas uma nota para quem estiver lendo isso. A resposta abaixo é a mesma, mas com um exemplo (ou seja, você usa HttpContext.Current.Handler).
mike nelson,
15

Você pode querer usar HttpContext.Current.CurrentHandlerse quiser a página precisa que está sendo executada no momento. Por exemplo, uma solicitação para Default.aspx é enviada, mas um erro é lançado e você faz um Response.Transferna sua página personalizada ErrorHandler.aspx. CurrentHandlerretornará a instância de ErrorHandler.aspx (se chamado após o erro), enquanto HttpContext.Current.Handlerretornará uma instância de Default.aspx.

user452427
fonte
0

Consulte minha resposta:
Por que HttpContext.Current.Handler é nulo?

Talvez tenha resolvido seu problema.

Amin Ghaderi
fonte
Estou usando o mesmo código para meu trabalho, mas fiquei muito chateado porque não estava ciente dos detalhes dos detalhes do trabalho. Então desenvolvi esse código para o meu trabalho. Achei que Colocasse código Aqui Para ajudar amigos que tenham meu problema. Obrigado John Saunders.
Amin Ghaderi