如何在 PartView 中连接使用 HtmlHelper 扩展生成的 JavaScript 并添加到父视图

How to concatenate JavaScript generated with HtmlHelper extension inside PartialViews and add to parent View?

本文关键字:JavaScript 添加 视图 扩展 PartView 连接 HtmlHelper      更新时间:2023-09-26

我在父视图中有 2 个 PartViews。

在这两个 PartiaViews 中,我生成了一些 JavaScript 代码,这些代码需要包含在父视图的底部。

这是 HtmlHelper 扩展,它在 PartialView 中生成一些 JavaScript。

public static MvcHtmlString KO_ObjectFor<TModel>(this HtmlHelper<TModel> htmlHelper)
{
    String str = "some javascript code";
    return MvcHtmlString.Create(str);
}

这是父视图(主视图)

...
//First Partial View
<% Html.RenderPartial("_PartialViewFirst"); %>
//Second Partial View
<% Html.RenderPartial("_PartialViewSecond"); %>
//Here I need to display the JavaScript from the PartialViews
<script type="text/javascript">
   <%: Html.FunctionToConcatenateJavaScript() %>
</script>
...

什么是正确的方法?

您可以使用 Stack 在 HttpContext 中推送和弹出脚本:

public static class HtmlExtensions
{
    private const string ScriptsKey = "__scripts__";
    public static MvcHtmlString KO_ObjectFor<TModel>(this HtmlHelper<TModel> htmlHelper)
    {
        var stack = htmlHelper.ViewContext.HttpContext.Items[ScriptsKey] as Stack<string>;
        if (stack == null)
        {
            stack = new Stack<string>();
            htmlHelper.ViewContext.HttpContext.Items[ScriptsKey] = stack;
        }
        String str = "some javascript code";
        stack.Push(str);
        return new HtmlString("some code that the helper needs to generate and output to the view");
    }
    public static IHtmlString FunctionToConcatenateJavaScript(this HtmlHelper htmlHelper)
    {
        var stack = htmlHelper.ViewContext.HttpContext.Items[ScriptsKey] as Stack<string>;
        if (stack == null)
        {
            return MvcHtmlString.Empty;
        }
        var scriptTag = new TagBuilder("script");
        scriptTag.Attributes["type"] = "text/javascript";
        var sb = new StringBuilder();
        foreach (var script in stack)
        {
            sb.AppendLine(script);
        }
        scriptTag.InnerHtml = sb.ToString();
        return new HtmlString(scriptTag.ToString());
    }
}

然后你可以推:

<%= Html.KO_ObjectFor(x => x.Foo) %>
<%= Html.KO_ObjectFor(x => x.Bar) %>
...

然后在母版中全部弹出:

<%= Html.FunctionToConcatenateJavaScript() %>

也许你可以这样做:

部分 1:

@{
    ViewBag.JS = @Html.KO_ObjectFor(firstJs);
}

部分 2:

@{
    ViewBag.JS += @Html.KO_ObjectFor(secondJs);
}

主要:

<script type="text/javascript">
   @ViewBag.JS
</script>

对不起剃刀语法