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



在mvc3中,我可以轻松地将jQuery脚本标签移至页面底部" _layout.vbhtml"

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

然而,在ASP.NET MVC3中,当您使用编辑器模板创建控制器时,脚手架机制做了很多工作,将文件添加到create.create.cshtml,delete.cshtml,detailss.cshtml,costry.cshtml,create..cshtml等。cshtml和index.cshtml等...它们被强烈键入。

在这些视图文件中,脚本标签在<body>内部,但是如何在</body>标签之前将这些标签添加到页面底部?

您要寻找的是http://weblogs.asp.net/scottgu/archive/2010/112/12/12/asp-net-mvc-3-layouts-and-layouts-and-ang-------------layouts-and-ang------razor.aspx

部分

在您的</body>标签上方添加一个部分。

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

然后在您的视图中您可以定义将在本节中出现的内容。

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

您可以构建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>
)

最新更新