2012-04-23 23 views
15

¿Cómo puedo usar Razor en archivos CSS?Hojas de estilo dinámicas usando Razor

Estoy usando Razor View Engine durante algún tiempo y tenía curiosidad por usarlo en las hojas de estilo. Puedo utilizar la maquinilla de afeitar en <style> bloques de .cshtml archivos, pero me preguntaba si puedo usarlo en exteriores Css archivos también (me gustaría tener un formato .cscss). Así que busqué en Google y encontré dos cosas:

La primera es LESS: "El lenguaje dinámico de hojas de estilo". Parece fácil de usar y potente con todas las características, pero realmente necesito Razor-C#.

El segundo es Dynamic CSS Using Razor Engine, un artículo de CodeProject que es más parecido a lo que quiero pero no tiene soporte de caché o precompilación (por "no apoyo" me refiero a que el escritor no mencionó estos aspectos). También me gustaría tener algunos resaltados de sintaxis en Visual Studio, pero esto es secundario.

Entonces, ¿cómo puedo escribir Razor en archivos CSS con un costo mínimo de rendimiento y preferiblemente con resaltado de sintaxis?

  • ¿Existe un proyecto "más completo" para eso?
  • ¿Puedo mejorar el proyecto anterior para lograr el almacenamiento en caché/compilación? ¿Si es así, cómo?

Como nota al margen:
me encontré con un proyecto llamado RazorJS. Es como la versión de Javascript de lo mismo que quiero para CSS con su soporte de almacenamiento en caché. Lo menciono solo para aclarar mis necesidades. No necesito usar Razor en Javascript actualmente pero supongo que si lo hago con CSS, hacer lo mismo con Javascript no sería demasiado difícil.

+0

Sigues hablando de sintaxis resaltar Esto no tiene nada que ver con la afeitadora. Es Visual Studio que hace tu editor. ¿Qué es lo que estás tratando de lograr, por qué quieres 'navaja' en tu CSS? – TJHeuvel

+3

@TJHeuvel ¿Por qué alguien quiere una afeitadora en su html? ¿Por qué la gente usa lenguajes de scripting del lado del servidor? Porque quieren que sus páginas sean dinámicas. De esta forma pueden almacenar sus datos en una base de datos en lugar de un archivo html. Entonces, ¿por qué quiero afeitarme en mi CSS? Es porque también quiero que mi CSS sea dinámico. Puedo conservar datos relacionados con el diseño en mi base de datos (como color de fondo) y quiero usarlos en mi CSS. En cuanto a intellisense, visual-studio es una de las etiquetas de este qustion. Quiero saber cómo puedo (si puedo) usar razor intellisense en archivos CSS y como mencioné, es solo algo secundario para mí. –

+0

@ d4wn: ¿Por qué quieres que tu CSS sea dinámico? Hay una gran diferencia entre SASS/LESS y un enfoque de motor de vista, en el último caso, simplemente estás enviando al cliente cosas que no están en la memoria caché que podrían ser estáticas ...: S –

Respuesta

29

Se puede crear un motor de vista personalizada:

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); 
    } 
} 

y registrarlo con una extensión personalizada en Application_Start:

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

y web.config dentro de asociar la extensión con un proveedor de generación:

<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> 

[nota, si obtiene un error de encuadernación ensamblado, es posible que necesite cambiar el número de versión en el tipo de extensión para que coincida con su versión del motor Razor. Puede verificar qué versión está usando al mirar las propiedades de su referencia a System.Web.WebPages.ensamblado de la maquinilla en su proyecto]

Y el último paso es tener algún controlador:

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

y una vista correspondiente: (~/Views/Styles/Foo.cscss):

@model AppName.Models.MyViewModel 

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

body { 
    background-color: Red; 
} 

que ahora se podría incluir como un estilo en el diseño:

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

Eso es exactamente lo que estaba buscando, gracias tú. Mi siguiente misión es encontrar la forma de hacer que VS haga un poco de resaltado de sintaxis (y intellisense) para archivos ** .cscss **, supongo. –

+1

@Darin Dimitrov He copiado este código. Y cuando quiero compilar (F5) mi solución asp.net mvc3 en VS obtuve este error: Error No se pudo determinar el idioma del código para "~/Views/Styles/Test.cscss". AMS \ AMS \ ASPNETCOMPILER ¿Alguna idea de por qué? – elranu

+0

@Darin, el código es increíble, pero me pregunto cómo podría modificarse para servir un archivo Less, ya que implicaba un nivel extra de interpretación ... ¿pensamientos? – ekkis

Cuestiones relacionadas