【问题标题】:Razor section inclusions from partial view局部视图中的剃刀部分夹杂物
【发布时间】:2012-03-28 03:31:24
【问题描述】:

我的 _Layout.cshtml 中有脚本部分:

<html>
    <body>
    ...
        @RenderSection("FooterScript", required: false)
    </body>
</html>

我有包含@Html.RenderPartial("LinksBlock", someModel) 的视图“Index.cshtml”。 LinksBlock 部分需要脚本文件“links.js”。我想从我的部分视图中将 links.js 包含到 FooterScript 中,而不是从主视图(主视图不知道部分视图的依赖关系),并且我想确定,如果我在我的查看,仅包含 1 个 links.js。有可能吗?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 razor


    【解决方案1】:

    部分不适用于局部视图。但是您可以编写一对可以结合使用的自定义助手:

    public static class HtmlExtensions
    {
        public static IHtmlString RegisteredScripts(this HtmlHelper htmlHelper)
        {
            var ctx = htmlHelper.ViewContext.HttpContext;
            var registeredScripts = ctx.Items["_scripts_"] as Stack<string>;
            if (registeredScripts == null || registeredScripts.Count < 1)
            {
                return null;
            }
            var sb = new StringBuilder();
            foreach (var script in registeredScripts)
            {
                var scriptBuilder = new TagBuilder("script");
                scriptBuilder.Attributes["type"] = "text/javascript";
                scriptBuilder.Attributes["src"] = script;
                sb.AppendLine(scriptBuilder.ToString(TagRenderMode.Normal));
            }
            return new HtmlString(sb.ToString());
        }
    
        public static void RegisterScript(this HtmlHelper htmlHelper, string script)
        {
            var ctx = htmlHelper.ViewContext.HttpContext;
            var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext);
            var registeredScripts = ctx.Items["_scripts_"] as Stack<string>;
            if (registeredScripts == null)
            {
                registeredScripts = new Stack<string>();
                ctx.Items["_scripts_"] = registeredScripts;
            }
            var src = urlHelper.Content(script);
            if (!registeredScripts.Contains(src))
            {
                registeredScripts.Push(src);
            }
        }
    }
    

    然后在你的_Layout.cshtml:

    @Html.RegisteredScripts()
    

    在你的部分:

    @{Html.RegisterScript("~/scripts/foo.js");}
    

    【讨论】:

    • 如果我想有可能添加脚本分隔的文件和放置在局部视图中的脚本(其次,如果局部视图多次呈现,我想使用键来识别而不注册相同的脚本) ?
    • 我使用 .vsdoc 文件,第二种方式我想保留 Intellisence 支持(例如,它不应该像 Register("key", "}))
    • 太棒了。赞成。我还不打算使用它,但我想现在将它添加到我的代码库中!!! :)
    • 达林,你是天赐之物!!该解决方案非常棒,我们已立即投入使用。谢谢--我们做了一个修改,我们不确定这里是否使用Stack(后进先出),所以我们将其替换为Queue(而不是foreach循环,我们使用Dequeue逐渐清空收藏)。是否有意使用 Stack,而我们没有看到它的好处?
    猜你喜欢
    • 1970-01-01
    • 2014-03-26
    • 2011-10-10
    • 1970-01-01
    • 2018-04-24
    • 2012-04-13
    • 2012-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多