4

ページの下部にすべてのスクリプトを配置する必要があります。問題は、部分ビューがある場合、「RenderSection」アプローチを使用できないことです。スクリプト ファイルの名前を取得してスタックにロードし、別のヘルパーがそれをベース レイアウトにレンダリングする HtmlHelper 拡張機能を追加する方法の良い例を見つけました: Razor section includes from partial view

それは素晴らしいことですが、ドロップインしたいスクリプトの小さなチャンク、または HTML でさえ、JS ファイル全体を作成する必要はありません。また、すべてを文字列として渡したくありません。素敵な書式設定とインテリセンスが必要なので、テンプレートを使用したいと思います。

@{Html.AddScript("test", @<text>
<script type="text/javascript">
    function RefreshPreview() {
        $('#AutoReplyHtml_Preview').html(
            $('#htmlTemplate').html()
                .replace('@@MESSAGE_TITLE@@', $('#AutoReplySubject').val())
                .replace('@@PRE_HEADER@@', $('#AutoReplyPreHeader').val())
                .replace('@@MESSAGE_BODY@@', $('#AutoReplyHtml').val())
        );

        $('#AutoReplyPlainText_Preview').html(
            $('#plainTextTemplate').html()
                .replace('@@MESSAGE_BODY@@', $('#AutoReplyPlainText').val())
        );
    }

    $(document).ready(function() {
        RefreshPreview();
    });
</script>
</text>);}

問題は-テンプレートの値をメソッドに取得する方法です。準拠するこのコードがありますが、「コード」パラメーターからデータを取得する方法の手がかりがありません:

    public static string AddScript(this HtmlHelper htmlHelper, string title, Func<object, object> code) {
    var ctx = htmlHelper.ViewContext.HttpContext;
    Dictionary<string, string> scripts = ctx.Items["HtmlHelper.AddScript"] as Dictionary<string, string>;
    if (scripts == null) {
        scripts = new Dictionary<string, string>();
        ctx.Items.Add("HtmlHelper.AddScript", scripts);
    }

    scripts.Add(title, code.ToString()); //Doens't work!

    return string.Empty;
}

テンプレート内の値を取得するには、どのようにデリゲート パラメータを微調整する必要がありますか??

4

1 に答える 1

2

ヘルパー アーキテクチャは、リスト内の各項目などで動作するテンプレートを提供するシナリオに対応できるように設計されています。このようなシナリオでは、もちろん、リストを反復処理するときに「現在の」アイテムを渡すことができるようにする必要があります。

ただし、他のシナリオ (あなたのシナリオなど) では、現在のアイテムはありません。それでも、お気づきのように、1 つのパラメーターを使用するメソッドを定義するメソッドへのパラメーターとしてデリゲートを宣言する必要があります。それは問題ありません。ヘルパーでその引数を使用していないため (itemテンプレートでやや魔法のようなパラメーターを使用していないため)、実装で渡すだけnullで済みます。パラメーターをFunc<object, IHtmlString>ではなくとして宣言することをお勧めしますが、レンダリングする必要がある HTML エンコードされた文字列を取得するためにFunc<object, object>呼び出すだけです。code(null).ToString()

于 2012-06-09T02:03:39.353 に答える