ASP.NET MVC - динамическая таблица стилей - PullRequest
5 голосов
/ 15 мая 2009

Я хотел бы позволить пользователю выбрать цвет фона для веб-сайта и сохранить выбранный цвет в базе данных. Когда человек входит в фон, правильный цвет будет отображаться.

На основе следующего веб-сайта я могу установить цвет в файле CssHandler.ashx. Но как лучше всего получить информацию из базы данных?

Главная страница сайта,

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

site.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;
        }
    }
}

Ответы [ 3 ]

2 голосов
/ 23 мая 2009

Создание нескольких CSS-файлов и подстановка директивы намного эффективнее с точки зрения производительности.

Недостатком является то, что вам нужно будет поддерживать несколько файлов CSS, которые все делают одно и то же с разными цветами. Итак, я бы создал общий файл css. Затем для каждой возможной конфигурации (цвет фона, какой у вас) создайте свой собственный файл CSS. // принимая разумное количество комбинаций

Таким образом, клиенты будут кэшироваться, а веб-сервер будет обслуживать статические файлы.

1 голос
/ 15 мая 2009

Ну, чтобы соответствовать вашей опубликованной реализации, я бы сказал, что вам не нужно передавать имя CSS-файла обработчику. Просто извлеките идентификатор пользователя из сеанса и запросите у базы данных его цвет фона вместо чтения из файла. Кроме того, если вы хотите разрешить анонимным пользователям выбирать цвет, просто сохраните его в файле 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"];

и иди оттуда.

0 голосов
/ 15 мая 2009

Я думаю, что лучшим способом было бы иметь один CSS-файл с различными классами и передать имя класса в тег body:

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

И либо найдите способ сценария тега body, чтобы он отображал <body class="black>, либо создайте новый WebControl, который отображает как <body> (и предоставьте ему параметр рендеринга, который смотрит в контекст, чтобы понять, что он должен делать.

Этим способом вы можете хранить все свои CSS в одном месте, и вам не нужно редактировать реальный код, чтобы изменить цвет для одного конкретного класса, вы просто редактируете CSS.

...