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.

tsimon
źródło

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.
}
Popiół
źródło
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ą.

Kilhoffer
źródło
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.

użytkownik452427
źródło
0

Zobacz moją odpowiedź:
Dlaczego HttpContext.Current.Handler ma wartość null?

Może rozwiązał twój problem.

Amin Ghaderi
źródło
Używam tego samego kodu do swojej pracy, ale byłem tak zirytowany, ponieważ nie znałem szczegółów dotyczących pracy. Tak opracowałem ten kod dla mojej pracy. Pomyślałem, że umieść kod tutaj, aby pomóc znajomym, którzy mają mój problem. Dziękuję Johnowi Saundersowi.
Amin Ghaderi