2012-01-28 55 views
1

我正在使用AJAX从HTTP处理程序中的服务器端加载用户控件。要做到这一点,我创建一个新的页面对象并执行用户控制服务器端生成原始的HTML,像这样:如何从HttpContext.Current获取当前的ASP.NET主题?

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之间的一切功能评论,这实际上只是我的UserControl的HTML。

我遇到的问题是这些服务器控件中的一些需要ASP.NET主题支持。我发现了一种由页声明之后加入以下几行做到这一点:

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

这就像一个魅力与主题名称时硬编码。不过,我想从当前上下文中获取主题名称。我在网上看到的所有例子都要求你有一个页面对象以获得主题的名字。但是我从一个没有主题的新页面开始。

所以我的问题是是否有一种方法来从HttpContext中的某个地方加载主题名称,或者是通过AJAX从客户端传递主题名称来加载服务器端的唯一方法?

+0

关于会话状态的主题是什么存储指定它,您使用的是默认的主题? – Mikhail 2012-01-28 20:05:24

回答

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 2012-01-28 16:57:34

+0

你的第二个想法也是一个方便的代码。然而,这意味着如果我改变未来主题的应用方式,这个处理程序将不得不改变。现在有一些条件逻辑可以根据用户配置文件中存储的变量将它们应用于基本页面。我想我现在只会从客户端传递它。这样未来的更新不会破坏它。 – NightOwl888 2012-01-28 22:39:20

+0

好处理代码不必更改,因为此代码从web.config中获取主题。如果您希望主题基于用户,则可以使用任一会话或从用户个人资料中检索 – chandmk 2012-01-28 23:11:30