ASP.NET MVC — динамическая таблица стилей

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

Основываясь на следующем веб-сайте, я могу установить цвет в пределах 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;
        }
    }
}

person Ros    schedule 15.05.2009    source источник


Ответы (3)


Создание нескольких файлов CSS и замена директивы ‹ link > намного лучше с точки зрения производительности.

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

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

person ANaimi    schedule 23.05.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

or...

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

и иди оттуда.

person Jonathan Freeland    schedule 15.05.2009

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

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

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

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

person Oli    schedule 15.05.2009