4

我需要将所有脚本放在页面底部,问题是当我有部分视图时,我不能使用“RenderSection”方法。找到了一个很好的示例,说明如何添加一个 HtmlHelper 扩展,该扩展采用脚本文件的名称,加载到堆栈中,然后另一个助手将其呈现在基本布局上: 来自局部视图的剃刀部分包含

太好了 - 但我不想为我想要放入的一小段脚本甚至 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

帮助器体系结构的设计使其可以适应您提供模板的场景,该模板将在例如列表中的每个项目上进行操作。在这种情况下,您当然希望能够在遍历列表时将“当前”项传递给它。

但是,在其他情况下(例如您的情况),没有 current item。然而,正如您所发现的,您仍然必须将委托声明为方法的参数,该方法定义了使用一个参数的方法。没关系——因为你没有在你的助手中使用那个参数(你没有item在你的模板中使用有点神奇的参数)你可以null在你的实现中传递它。最好将您的参数声明为 aFunc<object, IHtmlString>而不是 a Func<object, object>,但无论如何,只需调用code(null).ToString()以获取您需要呈现的 HTML 编码字符串。

于 2012-06-09T02:03:39.353 回答