Asp.net mvc 4 在局部视图中使用截面

Asp.net mvc 4 在局部视图中使用截面,asp.net-mvc-4,razor,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", r

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

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>
@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)
}
@model PlatformaPu.Models.Shared._AppSelector

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

{CONTENT REMOVED FOR BREVITY}

试验
@RenderSection(“脚本”,必需:false)
@RenderBody()
因此,我的视图加载了一个特定的javascript,我希望它位于“脚本”部分,并且可以正常工作

Index.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>
@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)
}
@model PlatformaPu.Models.Shared._AppSelector

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

{CONTENT REMOVED FOR BREVITY}
@model PlatformaPu.Areas.Inventura.Models.Home.Index
@节脚本{
}
{为简洁起见删除了内容}
@节尾{
@Html.Partial(“~/Views/Shared/_AppSelector.cshtml”,Model.AppSelector)
}
最后,我的视图呈现一个部分,我有一个javascript,该部分加载

\u AppSelector.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>
@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)
}
@model PlatformaPu.Models.Shared._AppSelector

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

{CONTENT REMOVED FOR BREVITY}
@model PlatformaPu.Models.Shared.\u AppSelector
@节脚本{
}
{为简洁起见删除了内容}
…这不起作用-javascript标记未在“脚本”部分中呈现

如何执行此操作?

如中所述,不可能在局部视图中使用节:

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


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

这是我的第一个答案

我多年来一直在使用webforms,现在我正在处理MVC5。有点难

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

在Layout.cshtml中。添加第二个“脚本空间”部分

@RenderSection("ScriptsPartial", required: false)
在Index.cshtml中,添加“新建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>");
        });
    }
}
@{
if(ViewData.ContainsKey(“ViewPage”))
{
System.Web.Mvc.WebViewPage viewPage=(System.Web.Mvc.WebViewPage)ViewData[“viewPage”];
viewPage.DefineSection(“scriptsparial”,()=>
{
//viewPage.Write(Scripts.Render(“~/AppSelector/Scripts”);//如果使用捆绑包
viewPage.WRITELETERAL(“”);
});
}
}
只需将视图“发送”到PartialView(没有WebForms中的父属性?),并使用它将内容添加到“ScriptSpatial”部分

“ScriptSpatial”是必需的,因为DefineSection抛出错误“已定义的部分:脚本”

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

致以最良好的祝愿


帕科·费雷(Paco Ferre)

我同时发现了这一点;但是,我现在想知道它是否是一个好的设计…你的意思是在主视图中引用脚本是否是一个好的设计?为什么您认为它可能不是?我的意思是引用子依赖项所需的脚本。这可能是一个糟糕的设计。为什么我要在主视图中添加一个只由一个页面使用的脚本,它使用我的部分视图??所以,我的应用程序的每一页都会有这个未使用的引用!