Ottieni System.Web.UI.Page corrente da HttpContext?
-
09-06-2019 - |
Domanda
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 web part 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 di sapere perché quanto sopra non funziona.
L'errore del compilatore è:Impossibile convertire System.Web.HttpContext in ...IWebBase tramite una conversione di riferimento, una conversione boxing, una conversione unboxing, una conversione wrap o una conversione di tipo null.
Soluzione
No, da MSDN su HttpContext.Current:"Ottiene o imposta l'oggetto HttpContext per la richiesta HTTP corrente."
In altre parole è un oggetto HttpContext, non una Page.
Puoi accedere all'oggetto Page tramite HttpContext usando:
Page page = HttpContext.Current.Handler as Page;
if (page != null)
{
// Use page instance.
}
Altri suggerimenti
Stai cercando HttpContext.Handler
.Poiché Page implementa IHttpHandler, otterrai un riferimento alla pagina attualmente in esecuzione. Dovrai eseguirne il cast, o almeno provare a eseguirne il cast nel tipo particolare che stai cercando.
HttpContext.Current
restituisce semplicemente l'istanza singleton di HttpContext.Pertanto non è e non potrà mai essere una pagina.
Potresti voler usare HttpContext.Current.CurrentHandler
se desideri la pagina precisa attualmente in esecuzione.Ad esempio, viene inviata una richiesta per Default.aspx, ma viene generato un errore e si esegue a Response.Transfer
alla pagina ErrorHandler.aspx personalizzata. CurrentHandler
restituirà l'istanza di ErrorHandler.aspx (se chiamato dopo l'errore) mentre HttpContext.Current.Handler
restituirebbe un'istanza di Default.aspx.
Si prega di vedere la mia risposta:
Perché HttpContext.Current.Handler è null?
Forse hai risolto il tuo problema.