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 テンプレートをビューの特定のセクションに適用し、それらのセクションで追加の変換を実行してから最終出力を生成できるようにすることです。

どんなアイデアでも大歓迎です!

更新:私はこれを達成する方法が単純な古い HtmlHelper 拡張機能を使用することを示唆しているこのSO の質問に出くわしました。私は彼らが何をしているのかについて不完全な理解をしているか、少なくとも彼らの力を過小評価しているようです. 実装状況はまた報告します。

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 に答える