在局部视图中使用部分

时间:2013-08-12 09:20:38

标签: asp.net-mvc-4 razor

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

Layout.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,我希望它在“脚本”部分,并且它正在工作。

Index.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}

...这 NOT 正在工作 - javascript标记在部分 NOT 呈现

我该怎么做?

2 个答案:

答案 0 :(得分:13)

this question中所述,无法在局部视图中使用部分:

  

节在部分视图中不起作用,这是设计的。您可以使用一些自定义帮助程序来实现类似的行为,但老实说,视图的责任是包含必要的脚本,而不是部分责任。我建议你使用主视图的@scripts部分来做到这一点,而不要让部分人担心脚本。

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

答案 1 :(得分:3)

这是我的第一个答案!

我多年来一直在使用网络表格,现在我正在处理MVC 5.很难。

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

在Layout.cshtml中。添加第二个&#34; ScriptsPartial&#34;栏目

@RenderSection("ScriptsPartial", required: false)

在Index.cshtml中,添加&#34;,新的ViewDataDictionary(ViewData){{&#34; ViewPage&#34;,this}}&#34;

@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>");
        });
    }
}

Just&#34;发送&#34; PartialView的视图(没有像WebForms中的Parent属性?)并使用它来向&#34; ScriptsPartial&#34;添加内容。部分。

&#34; ScriptsPartial&#34;是必需的,因为DefineSection会抛出一个错误&#34;已定义的部分:Scripts&#34;

因此,只有一个PartialView可以使用&#34; ScriptsPartial&#34;部分......不太好解决。

致以最诚挚的问候,

Paco Ferre