【问题标题】:Are there any view helpers to generate CSS?是否有任何视图助手来生成 CSS?
【发布时间】:2011-03-19 22:57:24
【问题描述】:

我喜欢 HTML 帮助器的想法,它允许我不必为常见元素编写所有 HTML,同时仍然让我完全控制、保留模型-视图分离并且可以进行强类型化。

我想知道是否可以以相同的方式生成 CSS 样式表或样式定义 - 在视图标记中使用帮助器?理想情况下,我希望根据一些面向对象的规则和定义生成一些 CSS。

除了样式表压缩和合并之外,我找不到任何解决方案。

【问题讨论】:

    标签: css asp.net-mvc helpers


    【解决方案1】:

    简单的方法是使用自定义视图结果:

    public class CssViewResult : PartialViewResult
    {
        private readonly object _model;
        public CssViewResult(object model)
        {
            _model = model;
        }
    
        public override void ExecuteResult(ControllerContext context)
        {
            this.ViewData.Model = _model;
            base.ExecuteResult(context);
            context.HttpContext.Response.ContentType = "text/css";
        }
    }
    

    然后是一个简单的控制器动作:

    public ActionResult MyCss()
    {
        SomeModel model = ...
        return new CssViewResult(model);
    }
    

    并在对应的MyCss.cshtml视图中:

    @model AppName.Models.SomeModel
    .foo {
        background-color: @Model.SomeColor;
    }
    

    然后:

    <link href="@Url.Action("MyCss", "SomeController")" rel="stylesheet" type="text/css" />
    

    【讨论】:

    • 这适用于剃须刀吗?我对 Web 表单视图引擎的体验是它会踩到内容类型标题,实际上我必须重写等效的 onprerender 才能使其工作。
    • @Wyatt Barnett,我提供的示例是 Razor,但它也应该适用于 WebForms 视图引擎。
    • 这仅适用于强类型一些 CSS 值,但它仍然不会在 .foo 和定义 class="foo" 的元素之间建立任何依赖关系。也就是说,如果在仍有元素在使用它的情况下从视图中删除 .foo,则不会收到任何警告/错误。
    【解决方案2】:

    您所要求的并非不可能,但默认情况下配置的方式是不可能的。原因是 CSS 文件不像视图那样被“解释”。他们只是通过了。

    您可以编写一些为您生成 CSS 的处理程序,但它不会像 HTML 帮助程序那样。

    理论上,您可以编写一个 Html 帮助程序来内联插入 CSS,但这确实违背了 CSS 背后的目的,因为现在您需要在多个文件中包含相同的 CSS,从而使您的视图更大并使用更多带宽。

    所以基本上,答案是.. 不,没有什么比 CSS 的 Html 助手更好的了。而它最有可能不存在的原因是它的背后更痛苦,而不是它的价值。

    【讨论】:

    • 好吧,GWT handles this problem neatly 通过强类型风格,所以这不是不可能的。我真的在寻找 ASP.NET MVC 中的类似功能,因为我使用 C# 而不是 Java 编写代码。
    猜你喜欢
    • 1970-01-01
    • 2011-09-11
    • 2012-10-03
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    • 2015-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多