Получить текущую System.Web.UI.Page из HttpContext?
-
09-06-2019 - |
Вопрос
На самом деле это вопрос из двух частей.Во-первых, соответствует ли 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 с помощью преобразования ссылок, преобразования упаковки, преобразования распаковки, преобразования переноса или преобразования нулевого типа.
Решение
Нет, из MSDN на HttpContext.Current:«Получает или задает объект HttpContext для текущего HTTP-запроса».
Другими словами, это объект HttpContext, а не Page.
Вы можете получить доступ к объекту Page через HttpContext, используя:
Page page = HttpContext.Current.Handler as Page;
if (page != null)
{
// Use page instance.
}
Другие советы
Вы ищете HttpContext.Handler
.Поскольку Page реализует IHttpHandler, вы получите ссылку на выполняющуюся в данный момент страницу. Вам придется привести ее или, по крайней мере, попытаться привести ее к конкретному типу, который вы ищете.
HttpContext.Current
просто возвращает одноэлементный экземпляр HttpContext.Следовательно, это не и не может быть страница.
Вы можете использовать HttpContext.Current.CurrentHandler
если вам нужна точная страница, которая выполняется в данный момент.Например, отправляется запрос на Default.aspx, но выдается ошибка, и вы выполняете Response.Transfer
на вашу пользовательскую страницу ErrorHandler.aspx. CurrentHandler
вернет экземпляр ErrorHandler.aspx (если он вызван после ошибки), тогда как HttpContext.Current.Handler
вернет экземпляр Default.aspx.
Пожалуйста, посмотрите мой ответ:
Почему HttpContext.Current.Handler имеет значение null?
Возможно, решил вашу проблему.