已定义以下部分但尚未为布局页面"〜/ Views/Shared/_Layout.cshtml"呈现:"脚本"

Kev*_*ark 89 asp.net asp.net-mvc

我是ASP MVC的新手,并利用Intro到ASP MVC 4 Beta教程http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/intro-to-aspnet -mvc -4-

我遇到了一个错误,我似乎无法找到答案,也没有太多的编程经验,所以我不知道在哪里开始修复这个教程.我感谢您提供的任何帮助.

我正在从控制器部分访问您的模型的数据,当我尝试创建一个电影作为教程的一部分,我收到此错误,我点击链接"创建新",我得到以下错误

已定义以下部分但尚未针对布局页面>"〜/ Views/Shared/_Layout.cshtml":"Scripts"进行渲染

我没有使用Visual Studio Express,而是选择下载Visual Studio 2012 RC(不确定这是否是我问题的根本原因.

我意识到你可能要求我包含代码来回答这个问题,但我不确定甚至包括哪些代码.请告知我需要包含哪些代码(如果有的话),我很乐意将其添加到我的问题中.

谢谢,

mgn*_*nan 128

这意味着您已在主Layout.cshtml中定义了一个部分,但您没有在视图中包含该部分的任何内容.

如果你的_Layout.cshtml有这样的东西:

@RenderSection("scripts")
Run Code Online (Sandbox Code Playgroud)

然后,使用该布局的所有视图必须包含@section具有相同名称的视图(即使该部分的内容为空):

@{
    ViewBag.Title = "Title";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
@section scripts{
    // Add something here
}
Run Code Online (Sandbox Code Playgroud)

作为替代方案,您可以将required设置为false,然后您不需要在每个View中添加该部分,

@RenderSection("scripts", required: false)
Run Code Online (Sandbox Code Playgroud)

或者你也可以包裹@RenderSection在一个if块,

@if (IsSectionDefined("scripts"))
{
    RenderSection("scripts");
}
Run Code Online (Sandbox Code Playgroud)

  • 虽然你的答案很好.我认为你应该指出,添加`,required:false)`使它成为`@RenderSection("scripts",required:false)`将允许它被包含或不被包含. (22认同)
  • 你的回答很有帮助.我没有在_Layout.cshtml中识别出任何@RenderSection("Scripts"),但我在为本教程创建我的电影控制器时自动创建的视图中注意到那些有@section Scripts {@ Scripts.Render(" 〜/ bundles/jqueryval")}所以我暂时删除了那些,现在一切正常. (7认同)
  • @KDark11创建视图时,VS会询问您是否要引用脚本.只是取消勾选. (3认同)

Jua*_*rto 24

此外,您可以将以下行添加到_Layout.cshtml_Layout.Mobile.cshtml:

@RenderSection("scripts", required: false)
Run Code Online (Sandbox Code Playgroud)


Fre*_*ing 22

我有一个3级的案例a'la _ MainLayout.cshtml <--- _ Middle.cshtml <--- Page.cshtml.即使这样做:

_MainLayout.cshtml

<head>
   @RenderSection("head", false)
</head>
Run Code Online (Sandbox Code Playgroud)

_Middle.cshtml

@section head {
    @RenderSection("head")
}
Run Code Online (Sandbox Code Playgroud)

并在Page.cshtml中定义

@section head {
   ***content***
}
Run Code Online (Sandbox Code Playgroud)

我仍然会得到错误

以下部分已定义,但尚未针对布局页面"〜/ Views/Shared/_Middle.cshtml":"head"进行渲染.

原来,错误是Middle.cshtml依赖/Views/_ViewStart.cshtml 来解析它的父布局.通过在Middle.cshtml中明确定义这个问题解决了这个问题:

@{
Layout = "~/Views/_Shared/_MainLayout.cshtml";
}
Run Code Online (Sandbox Code Playgroud)

无法确定这是否是按设计或MVC 4中的错误 - 无论如何,问题已经解决:)

  • 今天,我通过这里的代码示例学会了如何进行“中间布局”。`@section Foo {@RenderSection("Foo")}` 来“传递”这些部分!还必须使用“@RenderBody()”传递主体。 (5认同)

von*_* v. 10

如果建议的解决方案没有解决问题并且没有解决问题,我不确定为什么接受的答案被接受.实际上可能存在与此主题相关的两个相关问题.

问题#1

母版页(例如_Layout.cshtml)定义了一个部分,它是必需的,但是继承视图没有实现它.例如,

布局模板

<body>
    @* Visible only to admin users *@
    <div id="option_box"> 
        @* this section is required due to the absence of the second parameter *@
        @RenderSection("OptionBox") 
    </div>
</body>
Run Code Online (Sandbox Code Playgroud)

继承观

无需显示任何代码,只需考虑视图上没有实现@section OptionBox {}.

问题#1的错误

Section not defined: "OptionBox ".

问题#2

母版页(例如_Layout.cshtml)定义了一个部分,它是必需的,并且继承视图确实实现了它.但是,实现视图还有其他script部分在其(任何)主页面上定义.

布局模板

same as above

继承观

<div>
  <p>Looks like the Lakers can still make it to the playoffs</p>
</div>
@section OptionBox {
<a href"">Go and reserve playoff tickets now</a>
}
@section StatsBox {
<ul>
    <li>1. San Antonio</li>
    <li>8. L. A. Lakers</li>
</ul>
}
Run Code Online (Sandbox Code Playgroud)

问题#2的错误

The following sections have been defined but have not been rendered for the layout page "~/Views/Shared/_Layout.cshtml": "StatsBox"

OP的问题类似于问题#2,接受的答案是问题#1.

  • 同意,OP的评论是他删除了一个部分以便解决错误,这意味着他在视图中定义了一个部分,但没有在布局中,而不是像大多数答案所解决的那样(问题#2对应于他们描述的错误)所有其他答案都描述了一种不会产生错误的情况,而是"未定义部分"而不是"部分已定义但未呈现". (3认同)

Pas*_*nen 8

我认为我们的解决方案与众不同,所以我会在这里记录.

我们设置了Main布局,中间布局,然后是最终的动作页面渲染.Main.cshtml < - Config.cshtml < - Action.cshtml

只有当web.config出现customErrors='On/RemoteOnly'自定义错误且没有异常时才会Application_Error被调用.我可以Layout = null在Error.cshtml中捕获这个.例外是问题,缺少脚本部分.

我们确实在Main.cshtml中定义了它(带有required:false),而Action.cshtml没有写入脚本部分的任何东西.

解决方案是添加@section scripts { @RenderSection("scripts", false) }到Config.cshtml.


JMJ*_*JMJ 7

它基本上发生在_Layout.cshtml没有时:

@RenderSection("scripts", required: false)
Run Code Online (Sandbox Code Playgroud)

或者

@RenderSection("scripts")  
Run Code Online (Sandbox Code Playgroud)

WITHOUT

required: false
Run Code Online (Sandbox Code Playgroud)

在:那么,只需加@RenderSection(假"脚本",必需)_Layout.cshtml 和它的作品专门针对谁与工作的那些开发商Kendoui genarated项目.


Ann*_*unn 6

当您使用Visual Studio创建新模型时,某些版本的Visual Studio会自动为您生成视图文件,这似乎不匹配.我使用新的VS 2013社区版遇到了这个问题,并浏览了http://www.w3schools.com/aspnet/mvc_app.asp上的W3Schools教程,但上面的评论表明它不是教学方向的问题或者是单个版本的VS.

确实,您只需删除即可使错误消息消失

@Scripts.Render("~/bundles/jqueryval")

来自Visual Studio自动生成的创建/编辑布局的行.

但是,该解决方案并未解决根本原因,或者让您在完成本教程之前完成更多工作.在开发真实应用程序的某些时候(可能相当早),您将需要访问注释解决方案从您的应用程序中删除的jquery验证代码.

如果您使用VS为您创建新模型,它还会创建一组五个视图文件:创建,删除,详细信息,编辑和索引."创建"和"编辑"中的两个视图旨在让用户为作为模型基础的数据库记录中的字段添加/编辑数据.对于真实应用程序中的那些视图,您可能希望在将记录保存在db中之前使用jquery验证库进行一些数据验证.这就是VS增加以下几行的原因

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}
Run Code Online (Sandbox Code Playgroud)

在这两个观点的底部而不是其他观点.自动生成的代码正在尝试使验证库可用于这些视图,而不是其他视图.

发生错误是因为VS要么没有向共享的_Layout.cshtml文件添加相应的行,要么在上面的一个答案中添加它,但会将其注释掉.这条线是

@RenderSection("scripts", required: false)

如果您的某些视图具有脚本部分(如创建和编辑那样),则必须在布局中嵌入RenderSection命令.如果某些脚本具有该部分而某些脚本没有(如Delete,Details和Index不这样),则RenderSection命令必须具有该required: false参数.

所以最好的解决方案,如果你想做的不仅仅是完成本教程,还要将语句添加到_Layout.cshtml,而不是从编辑和创建视图中删除代码.

PS这里有点混淆,需要的是'bundle',而require语句似乎试图将文件包含在项目中不存在的bundle文件夹中.但是,对于调试版本和教程,这是不相关的,因为捆绑的文件一次只包含一个.请参阅:http://www.asp.net/mvc/overview/performance/bundling-and-minification此处有争议的代码在页面的三分之二处简要提及.