我有一个连接不同域的应用程序,而不是复制和修改每个应用程序,我在硬盘驱动器上使用相同的物理位置,但在IIS上使用单独的应用程序池和网站。
基本上我想根据主机名更改主题。即。用户来到“websome.com”获取“websome”主题,用户来到“jamessome.com”获得“jamessome”主题。
我在web.config“pages”属性中设置主题,该主题将全局主题应用于整个网站。有什么方法可以根据输入的域名使用来修改飞行设置吗?这可能是可能的,但是什么是缩小尺寸,为了简化解决方案,您建议如何处理小代码。据我所知,如果我每次用户进入时都会编辑web.config会花费大量时间而不是那么优雅......所以任何一个ASP.NET专家都可以编写两行代码,这样就会发生魔术?
网站上存在这些问题的解决方案很少,但这需要我在网站上的每个页面的Page_Init事件中添加代码,这是不切实际的。
答案 0 :(得分:8)
实际上,必须在Page_PreInit
中进行设置,如果您尝试更改Page_Init
中的主题,它将无效。
最常见的解决方案是为所有页面使用父类。这是一次性更改,并将逻辑放在父类中。而不是继承自Page
,而是继承自ThemedPage
。在类ThemedPage
内部,当然,它继承自Page
本身,您可以覆盖Page.OnPreInit方法。
你要求“两行”,如果你删除杂乱,它实际上是一行。这是VB:
Public Class ThemedPage
Inherits Page
Protected Overrides Sub OnPreInit(ByVal e As System.EventArgs)
Me.Theme = HttpContext.Current.Request.Url.Host.Replace(".com", "")
MyBase.OnPreInit(e)
End Sub
End Class
而不是这个:
Partial Class _Default
Inherits System.Web.UI.Page
你现在写下这个:
Partial Class _Default
Inherits ThemedPage
这就是全部!一次性搜索/替换,你就完成了。为了完整起见,这里是C#的相同(只有类):
// C# version
using System.Web;
using System.Web.UI;
public class ThemedPage : Page
{
protected override void OnPreInit(System.EventArgs e)
{
this.Theme = HttpContext.Current.Request.Url.Host.Replace(".com", "");
base.OnPreInit(e);
}
}
更新: 添加了VB代码示例
更新:添加了C#代码示例
注意: 主题必须存在,否则会出现异常:Theme 'ThemeName' cannot be found in the application or global theme directories.
。如果您想要默认主题或没有主题,如果主题不在那里,请将其包裹在try
/ catch
块周围,并使用catch
块来设置默认主题。