Динамически генерировать файл CSS из базы данных в ASP.NET MVC - PullRequest
11 голосов
/ 20 июля 2010

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

Мой вопрос: как мне создать динамический файл CSS на основе этих значений базы данных?

Я бы предпочел сделать что-нибудь с возможностью кэширования, но расширяемым, чтобы, если я хочу добавить больше редактируемых стилей, это не было бы проблемой

1 Ответ

20 голосов
/ 20 июля 2010

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

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");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...