【问题标题】:Using C# to dynamically generate CSS files使用C#动态生成CSS文件
【发布时间】:2011-05-08 00:53:15
【问题描述】:

我有一个部署到十几个客户的网站。主网站有一个基本模板,每个客户端都有一个覆盖颜色的客户端文件夹。问题是有很多 CSS 文件,因此进行强制我们更新每个客户端的更改需要很长时间。自动构建过程负责替换更新的文件。

我想将 CSS 文件改为用户控件,然后这些用户控件可以从另一个存储客户端特定值的用户控件继承。

因此,我将拥有一个继承自包含颜色的用户控件的 Forms.ascx 文件,而不是拥有一个 forms.css 文件和一个 /client/forms.css 文件。

例如:

<%@ Control Language="C#" ClassName="Forms" %>
<%@ Register TagPrefix="css" TagName="Client" Src="~/css/ClientStyling.ascx" %>

/* CSS Document */
body
{
  color:<%=Client.BodyColor%>
}

然后母版页将继承自用户控件。这将使客户站点的维护变得更加容易。

那么这种解决方案是否有效且值得推荐?还是有更好的方法来实现相同的最终结果?

如果可以,是否也可以让 Forms.ascx 控件将标记输出为 CSS?或者制作扩展名 .css 并且仍然具有 ascx 属性?

【问题讨论】:

  • 您是否设想 Client.BodyColor 来自数据库或配置文件?
  • 它将被硬编码在用户控件中。自动构建过程会处理它。

标签: c# asp.net css


【解决方案1】:

另一个需要考虑的选项可能只是使用“CSS 编译器”——例如SASSLESS 甚至HSS,它们可能支持诸如“mixins”之类的便捷结构并包括其他文件。这种方法可以使系统虽然不是动态的,但可以很容易地根据不同客户的需求进行配置。

例如,使用“CSS 编译器”整个颜色模式可以作为可导出变量或模板存储在单个文件中(取决于“编译器”)——修改该文件,“重新编译"** 和 wham,新的配色方案界面无处不在(SASS 还支持颜色数学 - 例如色调转换)。这可能使使用静态内容的部署/管理足以满足您的目的。

我使用 SASS(它符合我的需求/风格,而 LESS/HSS 不符合)。我不会切换回,除非我真的、真的不得不这样做(也就是说:呃,从不)——SCSS 模式下的 SASS 也理解 CSS 语法,因此你可以进行微进化或混合搭配( LESS 和 HSS 也可以这样工作,但 HSS 仅适用于更严格的 CSS 语法子集)。 CSS 编译器也可以与模板引擎(例如 TT4)一起使用,或者利用包含动态生成的文件(不是问题中的动态-动态,而是动态的,因为它们来自其他数据源)如果额外需要电源。

虽然只是普通的 CSS 级联和类名/选择器可以有很长的路要走,但我发现将“逻辑级联”(CSS,CSS/级联至关重要)和“天哪,我希望这能像一个模板”(CSS 编译器,它应该处理滥用 CSS/级联的情况)。

** SASS 和 LESS 都可以监控文件并自动为您重新编译它们。 SASS 甚至允许监控整个目录

【讨论】:

  • 刚开始玩 SASS。到目前为止我很喜欢它。
【解决方案2】:

您最好创建一个通用处理程序,而不是 Web 控件。这不会产生 Web 控件的开销。

  1. 在您的处理程序中,通过查询字符串接受 clientID - 这允许您在客户端级别进行缓存
  2. 在您的 .master 文件中,您可以链接到它

在您的处理程序中,您有几种使用 CSS 的方法。

  1. 只需为 css 准备一堆 response.write,并输入相关的客户端值
  2. 使用自己的特殊标识符创建一个外部 CSS 文件 - 可能是 。然后,您可以在 NameValuePair 集合中加载所有客户端特定值,然后遍历外部 CSS 文件,解析 并替换为正确的值。然后 response.write 这个文件。确实更复杂,但它允许大量更干净的 CSS 文件

【讨论】:

    【解决方案3】:

    这是完全可能的。您可能还需要考虑级联样式表,以便动态样式表导入(可能更大的)静态样式表。

    Asp.NET 也支持主题,但说实话 CSS 更强大。

    您为什么要考虑 ASCX 而不是 ASPX?我原以为一个 css 文件代表一个完整的响应,它可以全部放在一个页面中。

    ashx 可能是您可以实现的最轻、最快的处理程序形式,因此您可能想看看...

    哦,请确保您的缓存参数正确!

    【讨论】:

      【解决方案4】:

      把它写成一个文件,让浏览器像处理任何其他 CSS 文件一样选择它。

      制作内联样式表会阻止客户端缓存机制,从而强制您的 CSS 与每个页面一起提供。

      【讨论】:

      • 我不希望 css 内联。我希望它位于一个单独的 .css 文件中,然后由浏览器和服务器缓存。
      猜你喜欢
      • 1970-01-01
      • 2016-01-04
      • 2014-06-20
      • 1970-01-01
      • 1970-01-01
      • 2010-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多