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.