Pobrać aktualną stronę System.Web.UI.Page z HttpContext?


84

W rzeczywistości jest to dwuczęściowe pytanie. Po pierwsze, czy HttpContext.Current odpowiada bieżącemu obiektowi System.UI.Page?

Drugie pytanie, które jest prawdopodobnie związane z pierwszym, brzmi: dlaczego nie mogę użyć poniższego, aby sprawdzić, czy bieżąca strona implementuje interfejs:

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

Ogólny kontekst jest taki, że niektóre kontrolki muszą wiedzieć, czy działają jako webpart programu SharePoint, czy jako część struktury Asp.Net.

Rozwiązałem problem, wymagając od formantu przekazania odwołania do siebie samego i sprawdzając właściwość Page formantu, ale nadal jestem ciekawy, dlaczego powyższe nie działa.

Błąd kompilatora to: Nie można przekonwertować System.Web.HttpContext na ... IWebBase poprzez konwersję referencji, konwersję pudełkową, konwersję rozpakowywania, konwersję zawijania lub konwersję typu null.

Odpowiedzi:


144

Nie, z MSDN w HttpContext.Current: „Pobiera lub ustawia obiekt HttpContext dla bieżącego żądania HTTP”.

Innymi słowy, jest to obiekt HttpContext, a nie Page.

Możesz dostać się do obiektu Page poprzez HttpContext używając:

Page page = HttpContext.Current.Handler as Page;

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

2
Odebrano głos z powodu nieprawidłowości. Odpowiedź z HttpContext.Current.CurrentHandler jest poprawna! Jeśli zrobisz Server.Transfer, HttpContext.Current.Handler BĘDZIE POPRZEDNIA STRONĄ, HttpContext.Current.CurrentHandler BĘDZIE BIEŻĄCĄ STRONĄ
mike

37

Szukasz HttpContext.Handler. Ponieważ Page implementuje IHttpHandler, uzyskasz referencję do aktualnie wykonywanej strony i będziesz musiał ją rzutować lub przynajmniej spróbować rzutować na określony typ, którego szukasz.

HttpContext.Currentpo prostu zwraca pojedyncze wystąpienie HttpContext. Dlatego nie jest i nigdy nie może być stroną.


2
Tylko uwaga dla każdego, kto to czyta. Odpowiedź poniżej jest taka sama, ale z przykładem (tj. Używasz HttpContext.Current.Handler).
mike nelson

15

Możesz użyć, HttpContext.Current.CurrentHandlerjeśli chcesz dokładnie określić stronę, która jest obecnie wykonywana. Na przykład wysyłane jest żądanie dotyczące Default.aspx, ale generowany jest błąd i użytkownik wykonuje operację Response.Transferna niestandardowej stronie ErrorHandler.aspx. CurrentHandlerzwróci wystąpienie ErrorHandler.aspx (jeśli zostanie wywołane po błędzie), natomiast HttpContext.Current.Handlerzwróci wystąpienie Default.aspx.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.