Получить текущую System.Web.UI.Page из HttpContext?

85

На самом деле это вопрос из двух частей. Во-первых, соответствует ли HttpContext.Current текущему объекту System.UI.Page?

И второй вопрос, который, вероятно, связан с первым, - почему я не могу использовать следующее, чтобы увидеть, реализует ли текущая страница интерфейс:

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

Общий контекст состоит в том, что некоторые элементы управления должны знать, выполняются ли они как веб-часть SharePoint или как часть инфраструктуры Asp.Net.

Я решил проблему, потребовав от элемента управления передать ссылку на себя и проверив свойство Page этого элемента управления, но мне все еще любопытно, почему это не работает.

Ошибка компилятора: не удается преобразовать System.Web.HttpContext в ... IWebBase с помощью преобразования ссылки, преобразования упаковки, преобразования распаковки, преобразования упаковки или преобразования нулевого типа.

Цимон
источник

Ответы:

144

Нет, из MSDN на HttpContext.Current: «Получает или задает объект HttpContext для текущего HTTP-запроса».

Другими словами, это объект HttpContext, а не страница.

Вы можете перейти к объекту Page через HttpContext, используя:

Page page = HttpContext.Current.Handler as Page;

if (page != null)
{
     // Use page instance.
}
Ясень
источник
2
Проголосовано против, потому что это неверно. Ответ с HttpContext.Current.CurrentHandler правильный! Если вы выполняете Server.Transfer, HttpContext.Current.Handler БУДЕТ ПРЕДЫДУЩЕЙ СТРАНИЦЕЙ, HttpContext.Current.CurrentHandler БУДЕТ ТЕКУЩЕЙ СТРАНИЦЕЙ
Майк
37

Вы ищите HttpContext.Handler. Поскольку Page реализует IHttpHandler, вы получите ссылку на страницу, выполняющуюся в данный момент. Вам нужно будет преобразовать ее или, по крайней мере, попытаться преобразовать ее в конкретный тип, который вы ищете.

HttpContext.Currentпросто возвращает одноэлементный экземпляр HttpContext. Следовательно, это не страница, и никогда не может быть.

Килхоффер
источник
2
Просто примечание для всех, кто это читает. Ответ ниже такой же, но с примером (т.е. вы используете HttpContext.Current.Handler).
Майк Нельсон,
15

Вы можете захотеть использовать, HttpContext.Current.CurrentHandlerесли хотите, чтобы именно та страница выполнялась в данный момент. Например, запрос на Default.aspx отправляется, но выдается ошибка, и вы выполняете Response.Transferоперацию на своей пользовательской странице ErrorHandler.aspx. CurrentHandlerвернет экземпляр ErrorHandler.aspx (если вызывается после ошибки), тогда как HttpContext.Current.Handlerвернет экземпляр Default.aspx.

452427
источник
0

См. Мой ответ:
Почему HttpContext.Current.Handler имеет значение null?

Возможно решила вашу проблему.

Амин Гадери
источник
Я использую тот же код для своей работы, но меня так раздражало, что я не знал деталей работы. Итак, разработал этот код для моей работы. Я думал, что положите сюда код, чтобы помочь друзьям, у которых есть моя проблема. Спасибо Джону Сондерсу.
Амин Гадери 01