Отримати поточну System.Web.UI.Page із HttpContext?


84

Це насправді питання з двох частин. По-перше, чи відповідає 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 БУДЕ ТЕКУЩОЮ СТОРІНКОЮ
mike

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.


0

Будь ласка, перегляньте мою відповідь:
Чому HttpContext.Current.Handler є нульовим?

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


Я використовую той самий код для своєї роботи, але мене так дратувало, бо я не знав деталей деталей роботи. Так розробив цей код для моєї роботи. Я думав, що Покладіть код сюди, щоб допомогти друзям, які мають мою проблему. Дякую Джону Сондерсу.
Амін Гадері
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.