Ottenere il System.Web.UI.Page corrente da HttpContext?


85

Questa è in realtà una domanda in due parti. Innanzitutto, HttpContext.Current corrisponde all'oggetto System.UI.Page corrente?

E la seconda domanda, che è probabilmente correlata alla prima, è perché non posso usare quanto segue per vedere se la pagina corrente implementa un'interfaccia:

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

Il contesto generale è che alcuni controlli devono sapere se vengono eseguiti come webpart di SharePoint o come parte di un framework Asp.Net.

Ho risolto il problema richiedendo al controllo di passare un riferimento a se stesso e controllando la proprietà Page del controllo, ma sono ancora curioso del motivo per cui quanto sopra non funziona.

L'errore del compilatore è: Impossibile convertire System.Web.HttpContext in ... IWebBase tramite una conversione di riferimento, conversione boxing, conversione unboxing, conversione wrapping o conversione di tipo null.

Risposte:


144

No, da MSDN su HttpContext.Current: "Ottiene o imposta l'oggetto HttpContext per la richiesta HTTP corrente."

In altre parole, è un oggetto HttpContext, non un Page.

Puoi accedere all'oggetto Page tramite HttpContext usando:

Page page = HttpContext.Current.Handler as Page;

if (page != null)
{
     // Use page instance.
}

2
Votato perché errato. La risposta con HttpContext.Current.CurrentHandler è corretta! Se esegui un Server.Transfer, HttpContext.Current.Handler SARÀ LA PAGINA PRECEDENTE, HttpContext.Current.CurrentHandler SARÀ LA PAGINA CORRENTE
mike

37

Stai cercando HttpContext.Handler. Poiché Page implementa IHttpHandler, otterrai un riferimento alla pagina attualmente in esecuzione. Dovrai eseguire il cast, o almeno provare a lanciarlo al tipo particolare che stai cercando.

HttpContext.Currentrestituisce semplicemente l'istanza singleton di HttpContext. Pertanto, non è e non potrà mai essere una pagina.


2
Solo una nota per chiunque legga questo. La risposta di seguito è la stessa ma con un esempio (ovvero si utilizza HttpContext.Current.Handler).
mike nelson,

15

Si consiglia di utilizzare HttpContext.Current.CurrentHandlerse si desidera la pagina precisa attualmente in esecuzione. Ad esempio, viene inviata una richiesta per Default.aspx, ma viene generato un errore e si esegue una richiesta Response.Transferalla pagina ErrorHandler.aspx personalizzata. CurrentHandlerrestituirà l'istanza di ErrorHandler.aspx (se chiamato dopo l'errore) mentre HttpContext.Current.Handlerrestituirà un'istanza di Default.aspx.


0

Vedere la mia risposta:
Perché HttpContext.Current.Handler è null?

Forse ha risolto il tuo problema.


Uso lo stesso codice per il mio lavoro, ma ero così infastidito perché non ero a conoscenza dei dettagli dei dettagli del lavoro. Quindi ho sviluppato questo codice per il mio lavoro. Ho pensato che Metti il ​​codice qui per aiutare gli amici che hanno il mio problema. Grazie John Saunders.
Amin Ghaderi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.