MVC 4 - 如何将模板传递给 html 帮助程序方法

本文关键字:html 方法 帮助程序 MVC | 更新日期: 2023-09-27 18:36:34

我需要将所有脚本放在页面底部,问题是当我有一个部分视图时,我无法使用"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>);}

问题是 - 如何将模板的值获取到我的方法中,我有这个符合的代码,但不知道如何从"code"参数中获取数据:

    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;
}

我需要如何调整委托参数以获取模板中的值?

MVC 4 - 如何将模板传递给 html 帮助程序方法

帮助程序体系结构旨在适应以下方案:提供将操作的模板(例如,对列表中的每个项进行操作)。 在这种情况下,您当然希望在循环访问列表时能够向其传递"当前"项。

但是,在其他方案(例如您的方案)中,没有当前项目。 但是,正如您所发现的,您仍然必须将委托声明为定义使用一个参数的方法的方法的参数。 没关系 - 由于您没有在帮助程序中使用该参数(您没有使用模板中有点神奇的item参数),因此您可以在实现中null传递它。 最好将您的参数声明为 Func<object, IHtmlString> 而不是 Func<object, object> ,但无论如何,只需调用 code(null).ToString() 即可获取您需要渲染的 HTML 编码字符串。