Динамические Таблицы Стилей С Использованием Бритвы


Как я могу использовать Razor в CSS-файлах?

Я использую Razor View Engine в течение некоторого времени, и мне было любопытно использовать его в таблицах стилей. Я могу использовать Razor в <style> блоках .cshtml файлы, но мне было интересно, могу ли я использовать его во внешних .css файлы также (хотел бы иметь .формат cscss ). Поэтому я погуглил его и нашел две вещи:

Первый из них меньше: "динамический язык таблиц стилей". Он кажется простым в использовании и мощным со всеми функции, но мне нужен Razor-C#, на самом деле.

Второй-этодинамический CSS с использованием Razor Engine , статья CodeProject, которая больше похожа на то, что я хочу, но у нее нет поддержки кэширования или предварительной компиляции (под "без поддержки" я подразумевал, что автор не упоминал эти аспекты). Я также хотел бы иметь некоторую подсветку синтаксиса в Visual Studio, но это вторично.

Итак, как я могу написать Razor в CSS-файлах с минимальными затратами на производительность и предпочтительно с синтаксисом подсветка?

    Есть ли для этого" более полный " проект?
  • могу ли я улучшить вышеупомянутый проект для достижения кэширования / компиляции? Если да, то как?

в качестве примечания:
Я нашел проект под названиемRazorJS . Это похоже на версию Javascript того же самого, что я хочу для CSS с его поддержкой кэширования. Я упоминаю об этом только для того, чтобы прояснить свои потребности. Мне не нужно использовать Razor в Javascript в настоящее время, но я думаю, что если я сделаю это с CSS, делая то же самое с Javascript было бы не слишком сложно.

1 15

1 ответ:

Можно создать пользовательский механизм просмотра:

public class CSSViewEngine : RazorViewEngine
{
    public CSSViewEngine()
    {
        ViewLocationFormats = new[] 
        { 
            "~/Views/{1}/{0}.cscss", 
            "~/Views/Shared/{0}.cscss" 
        };
        FileExtensions = new[] { "cscss" };
    }

    protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
    {
        controllerContext.HttpContext.Response.ContentType = "text/css";
        return base.CreateView(controllerContext, viewPath, masterPath);
    }
}

, а также зарегистрировать его с пользовательским расширением в Application_Start:

ViewEngines.Engines.Add(new CSSViewEngine());
RazorCodeLanguage.Languages.Add("cscss", new CSharpRazorCodeLanguage());
WebPageHttpHandler.RegisterExtension("cscss");

И внутри паутины.config свяжет расширение с поставщиком сборки:

<compilation debug="true" targetFramework="4.0">
    <assemblies>
        ...
    </assemblies>

    <buildProviders>
        <add extension=".cscss" type="System.Web.WebPages.Razor.RazorBuildProvider, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
    </buildProviders>
</compilation>

[Примечание , Если вы получаете ошибку привязки сборки, вам может потребоваться изменить номер версии в типе расширения, чтобы соответствовать вашей версии движка Razor. Вы можете проверить, какую версию вы используете, посмотрев на свойства вашей ссылки на Система.Сеть.страницы.Сборка бритвы в вашем проекте]

И последний шаг-иметь некоторый контроллер:

public class StylesController : Controller
{
    public ActionResult Foo()
    {
        var model = new MyViewModel
        {
            Date = DateTime.Now
        };
        return View(model);
    }
}

И соответствующий вид: (~/Views/Styles/Foo.cscss):

@model AppName.Models.MyViewModel

/** This file was generated on @Model.Date **/

body {
    background-color: Red;
}

Который теперь можно включить в качестве стиля в макет:

<link href="@Url.Action("Foo", "Styles")" rel="stylesheet" type="text/css" />