5

我想让用户选择网站的背景颜色并将所选颜色保存在数据库中。当此人登录背景时,将显示正确的颜色。

基于以下网站,我可以在CssHandler.ashx文件中设置颜色。但是,从数据库中获取信息的最佳方式是什么?

网站母版页,

<link href="../../Content/CSSHandler.ashx?file=Site.css" rel="stylesheet" type="text/css" />

网站.css,

header
{
    background-color:#BG_COLOR#;
}

CssHandler.ashx,

public class CssHandler : IHttpHandler
{

    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "text/css";

        // Get the file from the query stirng
        string File = context.Request.QueryString["file"];

        // Find the actual path
        string Path = context.Server.MapPath(File);

        // Limit to only css files
        if (System.IO.Path.GetExtension(Path) != ".css")
            context.Response.End();

        // Make sure file exists
        if (!System.IO.File.Exists(Path))
            context.Response.End();

        // Open the file, read the contents and replace the variables
        using (System.IO.StreamReader css = new System.IO.StreamReader(Path))
        {
            string CSS = css.ReadToEnd();
            CSS = CSS.Replace("#BG_COLOR#","Blue");
            context.Response.Write(CSS);
        }
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}
4

3 回答 3

2

在性能方面,创建多个 CSS 文件并替换 <link> 指令要好得多。

不利的一面是你需要维护几个 CSS 文件,它们都用不同的颜色做同样的事情。所以我要做的是创建一个通用的css 文件。然后为每个可能的配置(背景颜色,你有什么),创建自己的 CSS 文件。// 假设有合理数量的组合

这样,客户端将缓存,而网络服务器将提供静态文件。

于 2009-05-23T08:46:31.267 回答
1

好吧,为了与您发布的实现保持一致,我想说您不需要将 CSS 文件名传递给处理程序。只需将用户的 ID 从会话中拉出并查询数据库的背景颜色,而不是从文件中读取。或者,如果您想允许匿名用户选择颜色,只需将其存储在处理程序检查的 cookie 中。

所以,换...

// Get the file from the query stirng
string File = context.Request.QueryString["file"];

和...

// Get user ID from session
int userId = Convert.ToInt32(Session["UserId"]));
// Now, pull background color from database

或者...

// Get background color preference from cookie
HttpCookie cookie = Request.Cookies["Preferences"];
string bgColor = cookie["BackgroundColor"];

然后从那里去。

于 2009-05-15T13:48:21.990 回答
0

我认为更好的方法是拥有一个包含各种类的 CSS 文件,并将类名传递给你的 body 标签:

.black {background:#000}
.blue {background:#00f}

或者找到一种方法来编写 body 标签以便它呈现<body class="black>,或者创建一个WebControl呈现为的新标签<body>(并给它一个呈现选项,它可以根据上下文来确定它应该做什么。

通过这些方式,您可以将所有 CSS 保存在一个位置,而无需编辑实际代码来更改特定类的颜色,您只需编辑 CSS。

于 2009-05-15T13:23:38.803 回答