0

是否可以在@helper 的输出上实现自定义转换?我的意思是要找到一个解决方案,让我有一些类似的东西:

@helper RenderCombinedStylesheetsWithColorOverride(string color)
{
    <link rel="stylesheet" type="text/css" href="menu.css" />
    <link rel="stylesheet" type="text/css" href="site.css" />
    <style type="text/css">
        * { color: @color; }
    </style>
}

扭曲是在助手的名称(RenderCombinedStylesheets...),它暗示了我想在这里做什么。也就是说,获取帮助程序的正常 HTML 编码输出,并将其通过我的自定义代码传递。在那里,我想把它拆开,然后重新组装,以便最终输出是<link rel="stylesheet" ... />对生成的组合和缩小 css 文件的单个引用。

请注意,这是一个简化的示例!实际上,有多个参数,并且输出转换不​​仅限于组合样式表片段。我也想以这种方式生成 JavaScript 代码。

主要目标是想出一些东西,让我可以将普通的 Razor 模板应用到我的视图的特定部分,然后在发出最终输出之前对这些部分执行额外的转换。

任何想法表示赞赏!

更新:我偶然发现了这个SO question,这表明实现这一点的方法是通过普通的 HtmlHelper 扩展。看来我对他们的所作所为并不完全了解,或者至少低估了他们的力量。我将报告实施情况。

4

1 回答 1

0

是的!我在更新的问题中链接的帖子是正确的!这是解决方案:

public static class ResourceCombiningHelper
{
    private static string MakeKey(string type)
    {
        return "CombinableResource" + (type ?? "").ToLowerInvariant();
    }

    public static IHtmlString CombinableResource(this HtmlHelper helper, dynamic template, string type)
    {
        var key = MakeKey(type);
        var context = helper.ViewContext.HttpContext;
        var resources = (List<dynamic>)context.Items[key];

        if (resources == null)
        {
            resources = new List<dynamic> { template };
            context.Items[key] = resources;
        }
        else
        {
            resources.Add(template);
        }

        return new HtmlString(String.Empty);
    }

    public static IHtmlString RenderCombinableResources(this HtmlHelper helper, string type)
    {
        var key = MakeKey(type);
        var context = helper.ViewContext.HttpContext;
        var resources = (List<dynamic>)context.Items[key];

        if (resources != null)
        {
            foreach (var resource in resources)
            {
                if (resource is HelperResult)
                {
                    // Add in-line content to combined resource here.
                }
                else if (resource is string)
                {
                    // Add external reference to combined resource here.
                }
            }
        }

        // Return a single reference to the combined resource (<link>, <script>, etc.)
    }
}

Razor 视图中的用法:

@helper ColorOverridingStyle(string color)
{
    <style type="text/css">
        * { color: @color; }
    </style>
}

@{ var color = ViewBag.TextColor; }
@Html.CombinableResource(Url.Content("~/Content/site.css"), "css")
@Html.CombinableResource(Url.Content("~/Content/menu.js"), "js")
@Html.CombinableResource(ColorOverridingStyle(color), "css")

最后的 HTML 输出示例:

<head>
    <link href="/Content/combined-css.css" rel="stylesheet" type="text/css" />
    <script src="/Content/combined-js.js" type="text/javascript"></script>
</head>

效果很好!去扩展这个小宝石的极限...... :)

于 2012-09-09T13:19:45.903 回答