【问题标题】:Dynamic Stylesheets Using Razor使用 Razor 的动态样式表
【发布时间】:2012-05-04 00:36:00
【问题描述】:

如何在 CSS 文件中使用 Razor?

我使用Razor View Engine 有一段时间了,我对在样式表上使用它感到好奇。我可以在<style> .cshtml 文件块中使用 Razor,但我想知道我是否也可以在外部 .css 文件中使用它(希望有一个 >.cscss 格式)。于是我google了一下,发现了两件事:

第一个是LESS:“动态样式表语言”。它似乎易于使用且功能强大,但我需要 Razor-C#,真的。

第二个是Dynamic CSS Using Razor Engine,一篇 CodeProject 文章,它更像我想要的,但它没有缓存或预编译支持(我所说的“不支持”是指作者没有提到这些方面)。我也想在 Visual Studio 中突出显示一些语法,但这是次要的。

那么,如何在 CSS 文件中以最低的性能成本编写 Razor,最好使用语法高亮显示?

  • 有没有“更完整”的项目?
  • 能否改进上述项目以实现缓存/编译?如果是这样,怎么做?

附注:
我找到了一个名为RazorJS 的项目。这就像我想要的具有缓存支持的 CSS 的 Javascript 版本。我提到这一点只是为了澄清我的需求。我目前不需要在 Javascript 中使用 Razor,但我想如果我用 CSS 完成它,用 Javascript 做同样的事情不会太难。

【问题讨论】:

  • 您一直在谈论语法高亮,这与剃须刀无关。编辑器是 Visual Studio。您要实现什么目标,为什么要在 css 中使用“剃刀”?
  • @TJHeuvel 为什么有人想要在他们的 html 中使用 razor?为什么人们使用服务器端脚本语言?因为他们希望他们的页面是动态的。通过这种方式,他们可以将数据存储在数据库中,而不是 html 文件中。所以我为什么要在我的 css 中使用 razor 是因为我希望我的 css 也是动态的。我可能会在我的数据库中保留与设计相关的数据(如背景颜色),并希望在我的 css 中使用它。至于智能感知,visual-studio 是这个 qustion 的标签之一。我想知道如何(如果可以的话)在 css 文件中使用 razor intellisense,正如我所提到的,这对我来说只是次要的事情。
  • @d4wn:为什么你希望你的 CSS 是动态的? SASS/LESS 和视图引擎方法之间有很大的区别,在后一种情况下,您只是向客户端发送可能只是静态的非缓存内容...:S

标签: css visual-studio razor server-side


【解决方案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");

在 web.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 引擎版本。您可以通过查看项目中对 System.Web.WebPages.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" />

【讨论】:

  • 这正是我想要的,谢谢。我猜我的下一个任务是找到如何让 VS 为 .cscss 文件做一些语法高亮(和智能感知)。
  • @Darin Dimitrov 我已经复制了这段代码。当我想在 VS 中编译(F5)我的 asp.net mvc3 解决方案时,出现此错误:错误 136 无法确定“~/Views/Styles/Test.cscss”的代码语言。 AMS\AMS\ASPNETCOMPILER 知道为什么吗?
  • @Darin,代码很棒,但我想知道如何修改它以提供 Less 文件,因为这涉及额外级别的解释......想法?
猜你喜欢
  • 2022-11-05
  • 1970-01-01
  • 2015-04-07
  • 2018-01-29
  • 1970-01-01
  • 2021-09-15
  • 2017-09-17
  • 2014-04-29
  • 1970-01-01
相关资源
最近更新 更多