以下部分已定义,但尚未针对布局页面“〜/ Views / Shared / _Layout.cshtml”呈现:“脚本”


100

我是ASP MVC的新手,并利用了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 2012 RC,而不是使用Visual Studio Express(不确定这是否是我问题的根本原因。)

我知道您可能需要我包含代码来回答此问题,但是我不确定要包含什么代码。请告知您需要我包括什么代码,如果有的话,我很乐意将其添加到我的问题中。

谢谢,


您应该遵循该教程的Visual Studio 2012版本asp.net/mvc/tutorials/mvc-4/…– RickAndMSFT
6

1
我遇到了同样的问题,当我从@ {}中取出RenderSection并仅使用@时,我的问题得以解决。不知道为什么会这样-Guilherme
Ferreira

1
上面的评论中RickAnd的链接对我不起作用。但更重要的是,这不是教程问题,而是一个VS代码生成问题,很容易解决,不应该通过删除失败行来解决,因为在已接受的建议下方有许多答案。请参阅我的答案(stackoverflow.com/a/27152625/165164),以了解实际情况-至少对于某些版本的VS。
Anne Gunn 2014年

当视图定义了@section布局中未呈现的时,将产生所述错误(带有RenderSection)。如果您引用错误Layout,或者根本忘记引用布局,则可能会发生这种情况。参见@vonv的答案
StuartLC,

Answers:


144

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

如果您的_Layout.cshtml具有以下内容:

@RenderSection("scripts")

然后,所有使用该Layout的View都必须包含一个@section具有相同名称的(即使该节的内容为空):

@{
    ViewBag.Title = "Title";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
@section scripts{
    // Add something here
}

或者,您可以将required设置为false,则不需要在每个View中添加该部分,

@RenderSection("scripts", required: false)

或者您也可以将其包装成@RenderSection一个if块,

@if (IsSectionDefined("scripts"))
{
    RenderSection("scripts");
}

7
您的回答很有帮助。我没有在_Layout.cshtml中识别出任何@RenderSection(“ Scripts”),但在为本教程创建Movies控制器时自动创建的视图中确实注意到,这些视图具有@section脚本{@ Scripts.Render(“ 〜/ bundles / jqueryval“)}因此,我暂时删除了这些内容,目前一切正常。
凯文·达克

23
虽然你的答案是好的。我认为您应该指出,添加, required: false)使其@RenderSection("scripts", required: false)可以包含或不包含它。
Eonasdan 2012年

3
@ KDark11在创建视图时,VS询问您是否要引用脚本。只是取消勾选。
Eonasdan 2012年

1
我同意将其@RenderSection("scripts", required: false)放入生成的_Layout.cshtml是正确的解决方案。(有关原因,请参见下面的讨论。)这样,您可以将修补程序添加到一个文件中,而不是全部添加-一个DRYer修补程序。
Anne Gunn 2014年

@Eonasdan哇,真棒!他们何时添加了该功能?请不要告诉我v1.0:-/
Simon_Weaver

25

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

@RenderSection("scripts", required: false)

24

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

_MainLayout.cshtml

<head>
   @RenderSection("head", false)
</head>

_Middle.cshtml

@section head {
    @RenderSection("head")
}

并在Page.cshtml中定义

@section head {
   ***content***
}

我仍然会收到错误

已经定义了以下部分,但尚未为布局页面“〜/ Views / Shared / _Middle.cshtml”:“ head”呈现。

原来,错误是Middle.cshtml依赖/Views/_ViewStart.cshtml 解析其父级布局。通过在Middle.cshtml中明确定义此问题,解决了该问题:

@{
Layout = "~/Views/_Shared/_MainLayout.cshtml";
}

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


我有同样的问题。关键是我要在RenderBody之前调用RenderSection,然后在Body Content中定义该部分。可以吗
Guilherme Ferreira 2014年

今天,由于这里的代码示例,我学习了如何进行“中间布局”。@section Foo {@RenderSection("Foo")}“传递”这些部分!还不得不用身体来传递@RenderBody()
starlocke

11

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

第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>

继承的观点

无需显示任何代码,只需考虑视图上没有实现@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>
}

问题2的错误

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

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


3
同意,OP的评论是他删除了一个部分以解决该错误,这意味着他在视图中定义了一个部分,但未在布局中定义该部分,反之亦然,因为大多数答案都是这样解决的(问题#2对应于他们所描述的错误)所有其他答案都描述了不会产生该错误的情况,而是“未定义部分”,而不是“已定义但未呈现的部分”。
AaronLS 2014年

8

我认为我们的解决方案与其他所有人都足够不同,因此我将在此处进行记录。

我们设置了主布局,中间布局,然后设置了最终操作页面。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。


7

基本上在_Layout.cshtml没有以下内容时发生:

@RenderSection("scripts", required: false)

或搭配

@RenderSection("scripts")  

没有

required: false

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


7

似乎在某些版本的Visual Studio为您自动生成的View文件之间存在不匹配,当您使用它来创建新的Model时。我在使用新的VS 2013 Community Edition并在http://www.w3schools.com/aspnet/mvc_app.asp上浏览W3Schools教程时遇到了此问题但是上面的注释表明它与教程说明或单一版本的VS。

的确,您可以通过删除以下命令使错误消息消失

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

从Visual Studio自动生成的创建/编辑布局中移出一行。

但是,该解决方案无法解决根本原因,也不能让您在完成本教程的基础上做更多的事情。在开发实际应用程序的某个时间点(可能相当早),您将需要访问注释解决方案从您的应用程序中删除的jquery验证代码。

如果使用VS为您创建新模型,它还会创建一组五个视图文件:创建,删除,详细信息,编辑和索引。这些视图中的两个(创建和编辑)旨在让用户为模型基础的数据库记录中的字段添加/编辑数据。对于实际应用中的那些视图,您可能需要在将记录保存到数据库之前使用jquery验证库进行一些数据验证。这就是为什么VS添加以下行

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

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

发生错误是因为VS不在共享的_Layout.cshtml文件中未添加相应的行,或者参见上面的一个答案,对其进行了添加但将其注释掉了。这条线是

@RenderSection("scripts", required: false)

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

因此,最好的解决方案是将语句添加到_Layout.cshtml,而不是从“编辑”和“创建”视图中删除代码,这是不仅仅完成本教程的工作。

PS这有点让人困惑,这里所需要的是在“捆绑包”中,而require语句看起来像是它试图将文件包含在项目中不存在的bundles文件夹中。但是,对于调试版本和教程,这无关紧要,因为捆绑文件一次只能包含一个。请参阅:http : //www.asp.net/mvc/overview/performance/bundling-and-minification在此页面中,大约有三分之二的时间简短地提及了此处所讨论的代码。


这个“石头”是一个很好的解释。也许是排在其后所以并没有得到多少票....
JosephDoggie

2

在Visual Studio 2012中使用ASP.NET MVC 4教程时,在“从控制器访问模型的数据”部分中遇到了相同的错误。解决方法非常简单。

在Visual Studio 2012中的共享文件夹_Layout.cshtml文档中的Visual Studio 2012中创建新的ASP.NET MVC 4 Web应用程序时,“脚本”部分被注释掉。

    @*@RenderSection("scripts", required: false)*@

只需取消注释该行,示例代码就可以工作。

    @RenderSection("scripts", required: false)

1

在为MVC初学者实施教程时,我遇到了同样的问题。我收到各种建议来修改您的layout.cshtml文件中的@RenderSection,但我没有使用它。

我进行了大量搜索,然后发现在(View / Edit.cshtml)和其他cshtml文件中生成的脚本标记未呈现

**@section Scripts {
@Scripts.Render("~/bundles/jqueryval")

} **

因此,我删除了这些行,并使应用程序开始平稳运行。



0

我在网上搜索了错误,然后转到了此页面。我正在使用Visual Studio 2015,这是我的第一个MVC项目。

如果在渲染部分之前错过了@符号,则将得到相同的错误。我想与以后的初学者分享。

 @RenderSection("headscripts", required: false)

0

我有一种感觉,您是从_Layout文件的@section中渲染您的部分,该文件引用带有@section的局部视图,即您已将@section嵌套在@section中。在_Layout文件中,删除rendersection周围的@section。



0

对我来说,问题出在我的_Layout.cshtml中,我在条件内有RenderSection

 @if (theme == "Red" || theme == "Green")
  {
       <div>
       @RenderSection("Footer", false)
       </div>
   }

在我的孩子看来,这是没有条件的

@section Footer{
        <div>
            @Html.AwButton("Reject", "Reject")
            @Html.AwSubmit("Ok", "Ok")
        </div>
    }

因此,无论主题如何,孩子都添加了页脚。但是在父级中,当主题不是红色或绿色时,没有添加页脚和未处理的异常。


-1

检查术语“”的拼写和大写/小写

每当我们编写@RenderSection(“ name”,required:false)时,请确保剃刀视图包含@section name {}部分,因此请检查术语“”的拼写和大写/小写情况,在此情况下正确的是“脚本”


-1

请确保您在视图中输入了使用脚本部分的正确拼写

正确的是

@section scripts{ //your script here}

如果您输入的@section script{ //your script here}是错误的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.