11

在我的共享布局中,我希望有一个“脚本”部分来填充页面功能所需的所有脚本。

布局.cshtml

<html>
<head>
    <title>Test</title>
    <script src="@Url.Content("~/Scripts/jquery-2.0.3.js")" type="text/javascript"> </script>

    @RenderSection("Scripts", required: false)

</head>
<body>
    @RenderBody()
</body>
</html>

所以,我的视图加载了一个特定的 javascript,我希望它位于“脚本”部分,并且它正在工作。

索引.cshtml

@model PlatformaPu.Areas.Inventura.Models.Home.Index

@section Scripts {
    <script src="@Url.Content("~/Areas/Inventura/Scripts/Home/Index.js")" type="text/javascript"></script>
}

{CONTENT REMOVED FOR BREVITY}

@section Footer {
    @Html.Partial("~/Views/Shared/_AppSelector.cshtml", Model.AppSelector)
}

最后,我的视图呈现了一个部分,并且我有一个该部分加载的 javascript。

_AppSelector.cshtml

@model PlatformaPu.Models.Shared._AppSelector

@section Scripts {
    <script src="@Url.Content("~/Scripts/Shared/_AppSelector.js")" type="text/javascript"></script>
}

{CONTENT REMOVED FOR BREVITY}

...这不起作用- javascript 标记未“脚本”部分呈现

我怎样才能做到这一点?

4

2 回答 2

15

正如在这个问题中所讨论的,不能在局部视图中使用部分:

部分在局部视图中不起作用,这是设计使然。您可以使用一些自定义助手来实现类似的行为,但老实说,包含必要的脚本是视图的责任,而不是部分的责任。我建议您使用主视图的 @scripts 部分来执行此操作,而不要让部分担心脚本。

您应该将脚本引用添加到引用部分的主视图。

于 2013-08-12T09:55:35.963 回答
3

这是我的第一个答案!

我多年来一直在使用网络表单,现在我正在处理 MVC 5。有点难。

也许是错误的解决方案,但有效:)

在 Layout.cshtml 中。添加第二个“ScriptsPartial”部分

@RenderSection("ScriptsPartial", required: false)

在 Index.cshtml 中,添加 ", new ViewDataDictionary(ViewData) { { "ViewPage", this } }"

@section Footer {
    @Html.Partial("~/Views/Shared/_AppSelector.cshtml", Model.AppSelector, new ViewDataDictionary(ViewData) { { "ViewPage", this } })
}

在 _AppSelector.cshtml 中,删除它

@section Scripts {
    <script src="@Url.Content("~/Scripts/Shared/_AppSelector.js")" type="text/javascript"></script>
}

在 _AppSelector.cshtml 中任意位置添加

@{
    if (ViewData.ContainsKey("ViewPage"))
    {
        System.Web.Mvc.WebViewPage viewPage = (System.Web.Mvc.WebViewPage)ViewData["ViewPage"];

        viewPage.DefineSection("ScriptsPartial", () =>
        {
            // viewPage.Write(Scripts.Render("~/AppSelector/Scripts")); // If you use a Bundle
            viewPage.WriteLiteral("<script src=\"" + Url.Content("~/Scripts/Shared/_AppSelector.js") + "\" type=\"text/javascript\"></script>");
        });
    }
}

只需将视图“发送”到 PartialView(没有 WebForms 中的 Parent 属性?)并使用它将内容添加到“ScriptsPartial”部分。

需要“ScriptsPartial”,因为 DefineSection 会抛出错误“section already defined: Scripts”

所以,只有一个 PartialView 可以使用“ScriptsPartial”部分......不是很好的解决方案。

最好的祝福,

帕科·费雷

于 2014-12-23T23:23:16.890 回答