Динамические Таблицы Стилей С Использованием Бритвы
Как я могу использовать 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 ответ:
Можно создать пользовательский механизм просмотра:
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" />