代码之家  ›  专栏  ›  技术社区  ›  Alastair Pitts

在ASP.NET MVC中从数据库动态生成CSS文件

  •  10
  • Alastair Pitts  · 技术社区  · 16 年前

    我想为我的web应用程序添加一些基本的主题支持,用户可以定制外观的各个部分。这些包括颜色、文本大小、字体和其他基本的东西。我将把它们存储在数据库中,并在每次访问页面时加载它们。

    我的问题是,如何根据这些数据库值生成动态CSS文件?

    我更喜欢做一些可以缓存但可扩展的事情,这样如果我想添加更多可编辑的样式,就不会有什么问题了。

    1 回复  |  直到 16 年前
        1
  •  22
  •   Alastair Pitts    16 年前

    我认为最简单的方法是向控制器添加以下操作方法:

    public class CssController : Controller {
        public ActionResult GetCss() {
            StringBuilder sb = new StringBuilder();
            Dictionary<string, string> cssValues = new Dictionary<string, string>();
            // populate dictionary with values from your database
            sb.AppendLine(".myDivClass {");
            foreach (var entry in cssValues) {
                sb.AppendLine(entry.Key + ": " + entry.Value);
            }
            sb.AppendLine("}");
            return Content(sb.ToString(), "text/css");
        }
    }
    

    <link href="<%: Url.RouteUrl(new { controller=  "CssController", action = "GetCss" }) %>" rel="stylesheet" type="text/css" />
    

    OP EDIT:我对这个方法做了一些小的修改,但是总的前提仍然存在。这是我使用的版本:

    public class CssController : Controller
    {
        public ContentResult GetTheme()
        {
            var builder = new StringBuilder();
            IDictionary<string, IDictionary<string, string>> css = new Dictionary<string, IDictionary<string, string>>();
    
            /* Populate css object from the database */
    
            foreach (var selector in css)
            {
                builder.Append(selector.Key);
                builder.Append(" { ");
                foreach (var entry in selector.Value)
                {
                    builder.Append(string.Format("{0}: {1}; ", entry.Key, entry.Value));
                }
                builder.AppendLine("}");
            }
    
            return Content(builder.ToString(), "text/css");
        }
    }