6

是否可以为 ASP.NET 网站创建默认主题?

例如,如果我有一个名为 的主题"Default",并且我选择了一个名为的主题,"NewTheme"并且我引用了一个在主题中不存在"NewTheme"但在"Default"主题中存在的文件,例如:

<asp:image id="img" runat="server" ImageUrl="~/Images/image.jpg" />

"/App_Themes/Default/Images/image.jpg"如果它不存在于,那么它可以被取走"/App_Themes/NewTheme/Images/image.jpg"吗?

此外,如果“NewTheme”中不存在 CSS 类,但在“默认”中存在,那么它可以采用“默认”吗?事实上,我认为最好先采用所有默认样式,然后覆盖任何“NewTheme”有冲突的样式。

我知道全局引用的工作方式与此类似,因为如果我选择"es"了本地化,并且文件中不存在密钥webreference.resx.es但它存在webreference.resx,那么它将从那里获取值。

我认为这将是 ASP.NET 主题的重要功能,因为我可以想象不同的主题只有某些图像发生了变化,并且某些样式发生了变化。我无法想象每个主题的每个图像和每种风格总是完全不同。因此,如果没有此功能,它将成为复制样式/图像的情况,我不喜欢这种情况(原因很明显!)。

4

2 回答 2

2

ASP.NET 不支持您描述的默认主题。有常规的ThemesStyleSheetThemes,但在页面请求级别动态更改它们比单独的控件或静态文件更有用。

您可以使用 URL 重写或路由为静态文件编写自己的主题版本——但它不再是真正的主题。

对于类似的控件<asp:Image>,您可以覆盖它们并修改属性,例如ImageUrl基于“主题”文件夹的某些层次结构中存在哪些文件。然后使用标记映射将该控件的所有实例替换为新控件,而无需更改任何标记。

FWIW,BeginRequestGlobal.asax 中的事件仅针对 IIS 中的动态文件调用(Cassini 也将其称为静态文件)。要在 IIS 中支持静态,您需要一个HttpModule,并且您还需要将 IIS 配置为在集成模式下运行。

于 2012-02-23T09:19:29.410 回答
1

此功能未内置在 ASP.NET 中。不过,您可以相当容易地实现它:

  1. HttpApplication.BeginRequest在 Global.asax 或自定义 HTTP 模块中挂钩事件。
  2. 在“/App_Themes/NewTheme/”下查找带有 URL 的请求。
  3. 检查文件是否HttpRequest.PhysicalPath存在。
  4. 如果该文件不存在,请调用HttpContext.RewritePath请求 URL 中的“NewTheme”并将其替换为“Default”。
于 2012-02-08T03:31:34.590 回答