Obtenir System.Web.UI.Page actuel de HttpContext?

84

C'est en fait une question en deux parties. Tout d'abord, le HttpContext.Current correspond-il à l'objet System.UI.Page actuel?

Et la deuxième question, qui est probablement liée à la première, est pourquoi je ne peux pas utiliser ce qui suit pour voir si la page actuelle implémente une interface:

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

Le contexte général est que certains contrôles doivent savoir s'ils s'exécutent en tant que composant WebPart SharePoint ou en tant que partie d'un framework Asp.Net.

J'ai résolu le problème en exigeant que le contrôle passe une référence à lui-même et en vérifiant la propriété Page du contrôle, mais je suis toujours curieux de savoir pourquoi ce qui précède ne fonctionne pas.

L'erreur du compilateur est la suivante: Impossible de convertir System.Web.HttpContext en ... IWebBase via une conversion de référence, une conversion de boxe, une conversion de déballage, une conversion d'encapsulation ou une conversion de type nul.

Tsimon
la source

Réponses:

144

Non, à partir de MSDN sur HttpContext.Current: "Obtient ou définit l'objet HttpContext pour la requête HTTP actuelle."

En d'autres termes, il s'agit d'un objet HttpContext, pas d'une page.

Vous pouvez accéder à l'objet Page via HttpContext en utilisant:

Page page = HttpContext.Current.Handler as Page;

if (page != null)
{
     // Use page instance.
}
Cendre
la source
2
Voté à la baisse parce que incorrect. La réponse avec HttpContext.Current.CurrentHandler est correcte! Si vous faites un Server.Transfer, HttpContext.Current.Handler SERA LA PAGE PRÉCÉDENTE, HttpContext.Current.CurrentHandler SERA LA PAGE ACTUELLE
mike
37

Vous cherchez HttpContext.Handler. Puisque Page implémente IHttpHandler, vous obtiendrez une référence à la page en cours d'exécution. Vous devrez la convertir, ou au moins essayer de la convertir dans le type particulier que vous recherchez.

HttpContext.Currentrenvoie simplement l'instance singleton de HttpContext. Par conséquent, ce n'est pas et ne peut jamais être une page.

Kilhoffer
la source
2
Juste un mot à tous ceux qui liront ceci. La réponse ci-dessous est la même mais avec un exemple (c'est-à-dire que vous utilisez HttpContext.Current.Handler).
mike nelson
15

Vous voudrez peut-être utiliser HttpContext.Current.CurrentHandlersi vous voulez la page précise en cours d'exécution. Par exemple, une demande pour Default.aspx est envoyée, mais une erreur est renvoyée et vous effectuez un Response.Transfersur votre page ErrorHandler.aspx personnalisée. CurrentHandlerrenverra l'instance de ErrorHandler.aspx (si elle est appelée après l'erreur) alors HttpContext.Current.Handlerque renverra une instance de Default.aspx.

user452427
la source
0

Veuillez consulter ma réponse:
pourquoi HttpContext.Current.Handler est nul?

Peut-être résolu votre problème.

Amin Ghaderi
la source
J'utilise le même code pour mon travail, mais j'étais tellement ennuyé parce que je n'étais pas au courant des détails des détails du travail. J'ai donc développé ce code pour mon travail. J'ai pensé que Mettre du code ici pour aider les amis qui ont mon problème. Merci John Saunders.
Amin Ghaderi