2012-01-28 5 views
1

Я использую AJAX для загрузки пользовательского элемента управления со стороны сервера в обработчике HTTP. Для этого я создаю новый объект страницы и выполнения на стороне сервера управления пользователя генерировать необработанный HTML, например, так:Как получить текущую тему ASP.NET из HttpContext.Current?

Dim page As New Page() 
    Dim frm As New HtmlForm 
    Dim commentTag As String = "CaptureText" 
    Dim viewControl As UserControl = CType(page.LoadControl(VirtualPathUtility.ToAbsolute(String.Format("~/Help/{0}.ascx",Topic))), UserControl) 
    page.Controls.Add(frm) 
    frm.Controls.Add(New LiteralControl(String.Format("<!-- {0} -->", commentTag))) 
    frm.Controls.Add(viewControl) 
    frm.Controls.Add(New LiteralControl(String.Format("<!-- /{0} -->", commentTag))) 

    Dim writer As New StringWriter() 
    context.Server.Execute(page, writer, False) 
    context.Response.ContentType = "text/html" 
    context.Response.Write(GetContents(writer.ToString, commentTag)) 

GetContents() просто функция, которая возвращает все между 2 жестко закодированы HTML комментарии, которые фактически являются только HTML моего UserControl.

Проблема, с которой я сталкиваюсь, заключается в том, что некоторые из этих элементов управления сервером требуют поддержки темы ASP.NET. Я нашел способ сделать это, добавив следующие строки после объявления страницы:

page.Theme = "Theme3" 
    page.Controls.Add(New System.Web.UI.HtmlControls.HtmlHead()) 

Это работает как шарм, когда жестко закодировано с именем темы. Однако я хотел бы получить название темы из текущего контекста. Все примеры, которые я видел в Интернете, требуют, чтобы у вас был объект страницы, чтобы получить название темы. Но я начинаю с новой страницы, в которой нет темы.

Итак, мой вопрос заключается в том, есть ли способ загрузить название темы из HttpContext или это единственный способ загрузить это на серверной стороне, передав имя темы клиенту через AJAX?

+0

, что о сохранении темы в состоянии сессии? – Mikhail

ответ

4
(System.Web.HttpContext.Current.Handler as System.Web.UI.Page).Theme; 

Или Предполагая, что вы используете тему по умолчанию, указав его в разделе Страницы

PagesSection pages = (PagesSection)WebConfigurationManager.GetSection("system.web/pages"); 

//use the them via pages.Theme 
+0

Я подумал об этом. Однако, поскольку я выполняю инструкцию из общего HTTP-обработчика, он не может быть отличен как страница типа. Любые другие мысли? – NightOwl888

+0

Ваша вторая идея - также удобная часть кода. Однако это означает, что этот обработчик должен измениться, если я изменю способ применения тем в будущем. В настоящее время существует некоторая условная логика, которая применяет их на базовой странице на основе переменной, хранящейся в профиле пользователя. Я думаю, что сейчас я просто передам его от клиента. Таким образом, будущие обновления не нарушат его. – NightOwl888

+0

Код дескриптора скважины не должен изменяться, так как этот код поднимает тему из web.config. И если вы хотите, чтобы тема была основана на пользователе, вы можете использовать либо сеанс, либо получить его из профиля пользователя – chandmk

Смежные вопросы