84 votes

Obtenir la page actuelle de System.Web.UI.Page à partir de HttpContext ?

Il s'agit en fait d'une question en deux parties. Premièrement, est-ce que le HttpContext.Current correspond à l'objet System.UI.Page actuel ?

Et la deuxième question, qui est probablement liée à la première, est la suivante : pourquoi ne puis-je 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 ont besoin de savoir s'ils s'exécutent en tant que webpart SharePoint, ou en tant que partie d'un cadre Asp.Net.

J'ai résolu le problème en demandant au contrôle de passer 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 : Impossible de convertir System.Web.HttpContext en ...IWebBase par le biais d'une conversion de référence, d'une conversion de type boxing, d'une conversion de type unboxing, d'une conversion de type wrapping ou d'une conversion de type null.

143voto

Ash Points 31541

Non, d'après MSDN sur HttpContext.Current : "Gets or sets the HttpContext object for the current HTTP request".

En d'autres termes, il s'agit d'un objet HttpContext, et non 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.
}

37voto

Kilhoffer Points 13430

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

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

15voto

user452427 Points 1

Vous pouvez utiliser HttpContext.Current.CurrentHandler si vous voulez la page précise qui est en cours d'exécution. Par exemple, une requête pour Default.aspx est envoyée, mais une erreur est générée et vous faites un Response.Transfer à votre page personnalisée ErrorHandler.aspx. CurrentHandler retournera l'instance de ErrorHandler.aspx (si elle est appelée après l'erreur) alors que HttpContext.Current.Handler renvoie une instance de Default.aspx.

0voto

Amin Ghaderi Points 109

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

Ça a peut-être résolu votre problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X