在MVC3中如何将所有脚本移动到页面底部的</body>之前?

Posted

技术标签:

【中文标题】在MVC3中如何将所有脚本移动到页面底部的</body>之前?【英文标题】:In MVC3 how to move all scripts to the bottom of the page before </body>? 【发布时间】:2012-11-02 15:41:21 【问题描述】:

在 MVC3 中,我可以轻松地将 jQuery 脚本标签移动到页面底部“_Layout.vbhtml

<script src="@Url.Content("~/Scripts/jquery-1.8.2.min.js")" type="text/javascript"></script>

但是,在 ASP.NET MVC3 中,当您使用编辑器模板创建控制器时,脚手架机制会执行大量工作,将文件添加到 Views 文件夹,例如 Create.cshtml、Delete.cshtml、Details.cshtml、Edit。 cshtml, 和 Index.cshtml 等等……它们是强类型的。

在这些视图文件中,脚本标签位于 &lt;body&gt; 内,但我如何将这些标签添加到页面底部紧挨在 &lt;/body&gt; 标签之前的位置?

【问题讨论】:

MVC4 有脚本捆绑。在 MVC3 中,如果您始终使用完整视图并且没有部分视图,则可以为“脚本”创建一个部分,然后在主布局中您可以在底部(甚至头部)呈现它们。另一个缺点是它不适用于部分/ajaxed 视图。 【参考方案1】:

你要找的是http://weblogs.asp.net/scottgu/archive/2010/12/30/asp-net-mvc-3-layouts-and-sections-with-razor.aspx的部分

在您的 &lt;/body&gt; 标记上方添加一个部分。

@RenderSection("Scripts", false)
</body>

然后在您的视图中,您可以定义将出现在此部分中的内容。

@section Scripts 
    <script>
        ...
    </script>

【讨论】:

这非常有效,除非您在局部视图中也有一个脚本部分,在这种情况下,只有第一个脚本部分会被渲染。 老实说,您不应该在代码中散布脚本。内联 我正在使用包含用于搜索和过滤等的 ajax 查找的部分视图。由于我在多个页面上使用它们,因此将脚本放在那里对我来说很有意义。我不知道最佳做法是什么,但它是一种适合我的方法。 规则 #1:为工作使用正确的工具。如果它适合你,那就继续走这条路。你没有说错,只是对不同的项目有不同的看法。【参考方案2】:

你可以构建一个html扩展函数,像这样

/// <summary>
///  This section is for adding a script to the <head> tag from a partial view (or any other place)
/// </summary>
private const string SCRIPTBLOCK_BUILDER = "_ScriptBlockBuilder_";

public static MvcHtmlString Script(this HtmlHelper htmlHelper, Func<object, HelperResult> template)

    htmlHelper.ViewContext.HttpContext.Items[SCRIPTBLOCK_BUILDER + Guid.NewGuid()] = template;
    return MvcHtmlString.Empty;


public static IHtmlString RenderScripts(this HtmlHelper htmlHelper)

    foreach (object key in htmlHelper.ViewContext.HttpContext.Items.Keys)
    
        if (key.ToString().StartsWith(SCRIPTBLOCK_BUILDER))
        
            var template = htmlHelper.ViewContext.HttpContext.Items[key] as Func<object, HelperResult>;
            if (template != null)
            
                htmlHelper.ViewContext.Writer.Write(template(null));
            
        
    
    return MvcHtmlString.Empty;

那么你就可以使用这两个功能了。在您的 _Layout.cshtml 中,您将 @Html.RenderScripts() 放在您想要呈现所有脚本的位置。

然后像这样将所有脚本包装在视图中

@Html.Script(
    @<script type="text/javascript">
         // Your scripts
    </script>
)

【讨论】:

以上是关于在MVC3中如何将所有脚本移动到页面底部的</body>之前?的主要内容,如果未能解决你的问题,请参考以下文章

Woocommerce 如何将优惠券表格移动到结帐页面的底部

Xamarin ContentPage.ToolbarItems移动到页面底部

如何将按钮与页面底部对齐

MVC3 如何将多个查询结果赋值到cshtml页面中?

如何在类别产品列表底部的 magento 2.1.8 中移动静态块

我如何在底部有页脚的所有屏幕上制作所有相同高度的卡片?