Aktuelle System.Web.UI.Page von HttpContext abrufen?

84

Dies ist eigentlich eine zweiteilige Frage. Entspricht der HttpContext.Current dem aktuellen System.UI.Page-Objekt?

Und die zweite Frage, die wahrscheinlich mit der ersten zusammenhängt, ist, warum ich Folgendes nicht verwenden kann, um festzustellen, ob die aktuelle Seite eine Schnittstelle implementiert:

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

Der allgemeine Kontext besteht darin, dass einige Steuerelemente wissen müssen, ob sie als SharePoint-Webpart oder als Teil eines Asp.Net-Frameworks ausgeführt werden.

Ich habe das Problem gelöst, indem ich vom Steuerelement verlangt habe, einen Verweis auf sich selbst zu übergeben und die Page-Eigenschaft des Steuerelements zu überprüfen, aber ich bin immer noch neugierig, warum das oben genannte nicht funktioniert.

Der Compilerfehler lautet: System.Web.HttpContext kann nicht über eine Referenzkonvertierung, Boxkonvertierung, Unboxingkonvertierung, Wrappingkonvertierung oder Nulltypkonvertierung in ... IWebBase konvertiert werden.

Tsimon
quelle

Antworten:

144

Nein, von MSDN auf HttpContext.Current: "Ruft das HttpContext-Objekt für die aktuelle HTTP-Anforderung ab oder legt es fest."

Mit anderen Worten, es ist ein HttpContext-Objekt, keine Seite.

Sie können über HttpContext zum Seitenobjekt gelangen, indem Sie:

Page page = HttpContext.Current.Handler as Page;

if (page != null)
{
     // Use page instance.
}
Asche
quelle
2
Abgestimmt, weil falsch. Die Antwort mit HttpContext.Current.CurrentHandler ist richtig! Wenn Sie einen Server.Transfer durchführen, wird HttpContext.Current.Handler die vorherige Seite sein, HttpContext.Current.CurrentHandler wird die aktuelle Seite sein
Mike
37

Du suchst HttpContext.Handler. Da Page IHttpHandler implementiert, erhalten Sie einen Verweis auf die aktuell ausgeführte Seite. Sie müssen sie umwandeln oder zumindest versuchen, sie auf den gewünschten Typ umzustellen.

HttpContext.CurrentGibt einfach die Singleton-Instanz von HttpContext zurück. Daher ist und kann es keine Seite sein.

Kilhoffer
quelle
2
Nur eine Notiz an alle, die dies lesen. Die Antwort unten ist dieselbe, jedoch mit einem Beispiel (dh Sie verwenden HttpContext.Current.Handler).
Mike Nelson
15

Möglicherweise möchten Sie verwenden, HttpContext.Current.CurrentHandlerwenn Sie die genaue Seite möchten, die gerade ausgeführt wird. Beispielsweise wird eine Anforderung für Default.aspx gesendet, es wird jedoch ein Fehler ausgegeben, und Sie führen eine Response.TransferBearbeitung für Ihre benutzerdefinierte ErrorHandler.aspx-Seite durch. CurrentHandlergibt die Instanz von ErrorHandler.aspx zurück (wenn nach dem Fehler aufgerufen), während HttpContext.Current.Handlereine Instanz von Default.aspx zurückgegeben wird.

Benutzer452427
quelle
0

Bitte beachten Sie meine Antwort:
Warum ist HttpContext.Current.Handler null?

Vielleicht haben Sie Ihr Problem gelöst.

Amin Ghaderi
quelle
Ich verwende denselben Code für meine Arbeit, war aber so verärgert, weil mir die Details der Arbeitsdetails nicht bekannt waren. Also habe ich diesen Code für meine Arbeit entwickelt. Ich dachte, dass Code hier setzen, um Freunden zu helfen, die mein Problem haben. Vielen Dank, John Saunders.
Amin Ghaderi