Получить текущий System.Web.UI.Page из HttpContext? - PullRequest
83 голосов
/ 12 сентября 2008

Это на самом деле вопрос из двух частей. Во-первых, соответствует ли 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 через преобразование ссылок, преобразование в бокс, распаковку без преобразования, преобразование с переносом или преобразование нулевого типа.

Ответы [ 4 ]

140 голосов
/ 12 сентября 2008

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

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

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

Page page = HttpContext.Current.Handler as Page;

if (page != null)
{
     // Use page instance.
}
37 голосов
/ 12 сентября 2008

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

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

15 голосов
/ 08 июля 2011

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

0 голосов
/ 01 августа 2013

Пожалуйста, смотрите мой ответ:
Почему HttpContext.Current.Handler имеет значение null?

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

...