2008-09-12 10 views
79

To właściwie dwuczęściowe pytanie. Po pierwsze, czy HttpContext.Current odpowiada bieżącemu obiektowi System.UI.Page?Pobierz bieżącą stronę System.Web.UI.Page z HttpContext?

I drugie pytanie, co jest prawdopodobnie związane z pierwszym, to dlaczego nie mogę korzystać z następujących czynności, 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, że niektóre kontrole muszą wiedzieć, czy działają jako witryna SharePoint, czy jako część struktury Asp.Net.

Rozwiązałem problem, wymagając od kontrolera podania odniesienia do niego i sprawdzenia właściwości strony kontrolki, ale nadal jestem ciekawy, dlaczego powyższe nie działa.

Błąd kompilatora to: Nie można przekonwertować pliku System.Web.HttpContext na ... IWebBase przez konwersję referencyjną, konwersję boksu, konwersję rozpakowywania, konwersję owijania lub konwersję typu null.

Odpowiedz

134

Nie, z MSDN na HttpContext.Current: "Pobiera lub ustawia obiekt HttpContext dla bieżącego żądania HTTP."

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

Można dostać się do obiektu strony poprzez HttpContext przy użyciu:

Page page = HttpContext.Current.Handler as Page; 

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

właśnie to, czego potrzebuję ... dzięki ... :) – AceMark

+0

To dało mi dostęp, którego potrzebowałem wewnątrz zespołu do sesji, prośby i odpowiedzi. Dziękuję Ci. – froggythefrog

+0

Dziękuję, niezła informacja. Pomogło mi to. – Ratna

37

Poszukujesz HttpContext.Handler. Ponieważ Strona implementuje IHttpHandler, uzyskasz odwołanie do aktualnie wykonywanej strony. Musisz ją rzucić, a przynajmniej spróbować przesłać ją do konkretnego typu, którego szukasz.

HttpContext.Current po prostu zwraca pojedynczą instancję HttpContext. Dlatego nie jest i nigdy nie może być stroną.

+2

Tylko uwaga dla każdego, kto to czyta. Poniższa odpowiedź jest taka sama, ale z przykładem (np. Używasz HttpContext.Current.Handler). –

13

Możesz użyć HttpContext.Current.CurrentHandler jeśli chcesz dokładną stronę, która jest aktualnie wykonywany. Na przykład żądanie Default.aspx jest wysyłane, ale generowany jest błąd i robisz Response.Transfer na niestandardowej stronie ErrorHandler.aspx. CurrentHandler zwróci instancję ErrorHandler.aspx (jeśli wywołano po błędzie), podczas gdy HttpContext.Current.Handler zwróci instancję Default.aspx.

0

proszę zobaczyć moją odpowiedź:
Why HttpContext.Current.Handler is null?

Być może rozwiązać Twój problem.

+0

-1 to jest to samo, co zaakceptowana odpowiedź. –

+0

Używam tego samego kodu do mojej pracy, ale Byłem tak zdenerwowany, ponieważ nie znałem szczegółów szczegółów pracy. Tak opracowałem ten kod dla mojego worke. Pomyślałem, że wpisz tutaj kod, aby pomóc przyjaciołom, którzy mają mój problem. Dziękuję John Saunders. –