W rzeczywistości jest to dwuczęściowe pytanie. Po pierwsze, czy HttpContext.Current odpowiada bieżącemu obiektowi System.UI.Page?
Drugie pytanie, które jest prawdopodobnie związane z pierwszym, brzmi: dlaczego nie mogę użyć poniższego, aby sprawdzić, czy bieżąca strona implementuje interfejs:
private IWebBase FindWebBase()
{
if (HttpContext.Current as IWebBase != null)
{
return (IWebBase)HttpContext.Current.;
}
throw new NotImplementedException("Crawling for IWebBase not implemented yet");
}
Ogólny kontekst jest taki, że niektóre kontrolki muszą wiedzieć, czy działają jako webpart programu SharePoint, czy jako część struktury Asp.Net.
Rozwiązałem problem, wymagając od formantu przekazania odwołania do siebie samego i sprawdzając właściwość Page formantu, ale nadal jestem ciekawy, dlaczego powyższe nie działa.
Błąd kompilatora to: Nie można przekonwertować System.Web.HttpContext na ... IWebBase poprzez konwersję referencji, konwersję pudełkową, konwersję rozpakowywania, konwersję zawijania lub konwersję typu null.
źródło
Szukasz
HttpContext.Handler
. Ponieważ Page implementuje IHttpHandler, uzyskasz referencję do aktualnie wykonywanej strony i będziesz musiał ją rzutować lub przynajmniej spróbować rzutować na określony typ, którego szukasz.HttpContext.Current
po prostu zwraca pojedyncze wystąpienie HttpContext. Dlatego nie jest i nigdy nie może być stroną.źródło
Możesz użyć,
HttpContext.Current.CurrentHandler
jeśli chcesz dokładnie określić stronę, która jest obecnie wykonywana. Na przykład wysyłane jest żądanie dotyczące Default.aspx, ale generowany jest błąd i użytkownik wykonuje operacjęResponse.Transfer
na niestandardowej stronie ErrorHandler.aspx.CurrentHandler
zwróci wystąpienie ErrorHandler.aspx (jeśli zostanie wywołane po błędzie), natomiastHttpContext.Current.Handler
zwróci wystąpienie Default.aspx.źródło
Zobacz moją odpowiedź:
Dlaczego HttpContext.Current.Handler ma wartość null?
Może rozwiązał twój problem.
źródło