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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top