Ответ 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>
[ note, если вы получите ошибку привязки сборки, вам может потребоваться изменить номер версии в типе расширения в соответствии с вашей версией движка 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" />