Obter System.Web.UI.Page atual de HttpContext?
-
09-06-2019 - |
Pergunta
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 procedimento 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 boxing, conversão unboxing, conversão de empacotamento ou conversão de tipo nulo.
Solução
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 acessar o objeto Page via HttpContext usando:
Page page = HttpContext.Current.Handler as Page;
if (page != null)
{
// Use page instance.
}
Outras dicas
Você está procurando HttpContext.Handler
.Como Page implementa IHttpHandler, você obterá uma referência para a página atualmente em execução. Você terá que convertê-la ou pelo menos tentar convertê-la para o tipo específico que está procurando.
HttpContext.Current
simplesmente retorna a instância singleton de HttpContext.Portanto, não é e nunca poderá ser uma página.
Você pode querer usar HttpContext.Current.CurrentHandler
se você deseja a página precisa que está em execução no momento.Por exemplo, uma solicitação para Default.aspx é enviada, mas um erro é gerado e você faz uma Response.Transfer
para sua página ErrorHandler.aspx personalizada. CurrentHandler
retornará a instância de ErrorHandler.aspx (se chamado após o erro), enquanto HttpContext.Current.Handler
retornaria uma instância de Default.aspx.
Por favor, veja minha resposta:
Por que HttpContext.Current.Handler é nulo?
Talvez tenha resolvido seu problema.