我使用Razor View Engine一段时间,我很好奇在样式表上使用它.我可以在< style>中使用Razor .cshtml文件的块,但我想知道我是否可以在外部.css文件中使用它(想要一个.cscss格式).所以我google了,发现两件事情:
第一个是LESS:“动态样式表语言”.它似乎易于使用和强大的所有功能,但我需要Razor-C#,真的.
第二个是Dynamic CSS Using Razor Engine,一个CodeProject文章更像我想要的,但它没有缓存或预编译支持(“不支持”我的意思是作者没有提到这些方面).我也想在Visual Studio中有一些语法突出显示,但这是次要的.
那么,如何以最低的性能成本在CSS文件中编写Razor,最好用语法突出显示?
有没有一个“更完整”的项目呢?
>我可以改进上述项目来实现缓存/编译吗?如果是这样,怎么办?
作为附注:
我发现一个名为RazorJS的项目.它就像我想要的CSS缓存支持的JavaScript版本一样.我提到这只是为了澄清我的需要.我现在不需要在Javascript中使用Razor,但是我猜想如果我用CSS做出来,用JavaScript做同样的事情不会太难.
解决方法
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" />