【问题标题】:The following sections have been defined but have not been rendered for the layout page "~/Views/Shared/_Layout.cshtml": "Scripts"以下部分已定义但尚未为布局页面“~/Views/Shared/_Layout.cshtml”呈现:“脚本”
【发布时间】:2012-06-13 19:54:28
【问题描述】:

我是 ASP MVC 的新手,正在使用 Intro to 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(不确定这是否是我的问题的根本原因。

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

谢谢,

【问题讨论】:

  • 您应该遵循该教程的 Visual Studio 2012 版本asp.net/mvc/tutorials/mvc-4/…
  • 我遇到了同样的问题,当我从 @{} 中取出 RenderSection 并仅使用 @ 时,我的问题得到了解决。不知道为什么会这样
  • RickAnd 上面评论中的链接对我不起作用。但更重要的是,这不是一个教程问题,它是一个 VS 代码生成问题,很容易修复,不应该只是通过删除失败行来掩盖,因为许多答案低于接受的答案。请参阅下面的我的回答 (stackoverflow.com/a/27152625/165164),了解实际情况的讨论——至少对于某些版本的 VS。
  • 当视图定义了一个未在布局中呈现的@section(使用RenderSection)时,会产生所述错误。如果您引用了错误的Layout,或者根本忘记引用布局,就会发生这种情况。见@vonv's answer

标签: asp.net asp.net-mvc


【解决方案1】:

对我来说,我说的是 script 而不是 scripts 我不知道为什么它在调试时没有将我显示为错误。

@section Script {}

【讨论】:

  • 如果您有新问题,请点击 按钮提出问题。如果有助于提供上下文,请包含指向此问题的链接。 - From Review
【解决方案2】:

我刚收到那个错误,我读到背后的原因是你必须渲染一个脚本部分。但在 _Layout 中已经是原样了。

@RenderSection("Scripts", required: false)

在我添加页面底部的部分之前它也有效。

在我的情况下,原因是Scripts 的拼写错误。

@section Scripts{
<script src="~/js/myScript.js"></script>
}

【讨论】:

    【解决方案3】:

    我已经像下面这样更改了“_Layout.cshtml”并且它可以工作。 .Net Core 3.1 Blazor Server 模块身份问题。

    <!DOCTYPE html>
    <html>
    
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
        <title>@ViewBag.Title</title>
        <link href="~/css/bootstrap/bootstrap.min.css" rel="stylesheet" />
        <link href="~/css/app.css" rel="stylesheet" />
        @RenderSection("Scripts", required: false)
    
    
    </head>
    
    <body>
        <div class="main">
            <div class="content px-4">
    
    
                @RenderBody()
            </div>
        </div>
    </body>
    
    </html>
    
    
    @section Scripts {    
        
    }
    

    【讨论】:

    • 另外一个解决方案是github.com/dotnet/Scaffolding/issues/… 我在更新身份注册页面时使用它,它显示 jquery 错误。
    • 添加@RenderSection("Scripts", required: false) 解决了这个问题。
    【解决方案4】:

    我还评论了**@section Scripts 比它运行平稳。 :)

    【讨论】:

      【解决方案5】:

      对我来说,问题出在我的 _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>
          }
      

      所以不管主题如何,孩子都在添加页脚。但是在父主题不是红色或绿色时,它没有添加页脚和抛出未处理的异常。

      【讨论】:

        【解决方案6】:

        我通过以下方法解决了这个问题,

        @await Html.PartialAsync("_ValidationScriptsPartial")
        

        【讨论】:

          【解决方案7】:

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

          正确的是

          @section scripts{ //your script here}
          

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

          【讨论】:

            【解决方案8】:

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

            【讨论】:

              【解决方案9】:

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

              每当我们写作时 @RenderSection(“名称”,必需:假) 确保剃刀视图包含一个部分 @部分名称{} 所以 检查术语“”的拼写和大写/小写 在这种情况下正确的是“脚本”

              【讨论】:

                【解决方案10】:

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

                如果你错过了渲染部分之前的@符号,你会得到同样的错误。我想分享给未来的初学者。

                 @RenderSection("headscripts", required: false)
                

                【讨论】:

                  【解决方案11】:

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

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

                  @RenderSection("scripts")
                  

                  那么所有使用该布局的视图必须包含一个同名的@section(即使该部分的内容为空):

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

                  作为替代方案, 你可以将required设置为false,那么你就不需要在每个View中添加section,

                  @RenderSection("scripts", required: false)
                  

                  或者您也可以将@RenderSection 包装在if 块中,

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

                  【讨论】:

                  • 您的回答很有帮助。我没有在 _Layout.cshtml 中识别出任何 @RenderSection("Scripts"),但我确实注意到在为本教程创建电影控制器时自动创建的视图中,那些具有 @section Scripts { @Scripts.Render(" ~/bundles/jqueryval") } 所以我暂时删除了这些,现在一切正常。
                  • 虽然你的回答很好。我认为您应该指出,添加, required: false) 使其成为@RenderSection("scripts", required: false) 将允许或不包含它。
                  • @KDark11 创建视图时 VS 会询问您是否要引用脚本。只需取消勾选即可。
                  • 我同意将@RenderSection("scripts", required: false) 放入生成的_Layout.cshtml 是正确的解决方案。 (有关原因,请参阅下面的讨论。)这样您就可以将修复添加到一个文件中,而不是全部 - 一个非常干燥的修复。
                  • @Eonasdan 哇,太棒了!他们什么时候添加了这个功能?请不要告诉我 v1.0 :-/
                  【解决方案12】:

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

                  确实,您可以通过删除

                  来使错误消息消失

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

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

                  但该解决方案并没有解决根本原因,也没有让您在完成教程的过程中做更多的事情。在实际应用程序开发的某个时间点(可能相当早),您将希望访问注释掉解决方案从您的应用程序中删除的 jquery 验证代码。

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

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

                  到这两个视图的底部,而不是其他视图。自动生成的代码试图使验证库可用于这些视图,但不能用于其他视图。

                  发生错误是因为 VS 没有向共享的 _Layout.cshtml 文件添加相应的行,或者,请参阅上面的一个答案,添加它但将其注释掉。这一行是

                  @RenderSection("scripts", required: false)

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

                  因此,如果您想要做的不仅仅是完成教程,最好的解决方案是将语句添加到 _Layout.cshtml,而不是从 Edit 和 Create 视图中删除代码。

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

                  【讨论】:

                  • 这个“摇滚”并且是一个非常好的解释。也许它是后来进来的,所以没有得到很多选票......
                  【解决方案13】:

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

                  我搜索了很多然后我发现在(View/Edit.cshtml)和其他cshtml文件中生成的脚本标签没有呈现

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

                  }**

                  所以我删除了这些行,应用程序开始顺利运行。

                  【讨论】:

                    【解决方案14】:

                    我认为我们的解决方案与其他人的解决方案有很大的不同,所以我将在这里记录下来。

                    我们设置了主布局、中间布局和最终的操作页面渲染。 Main.cshtml

                    只有当 web.config 有 customErrors='On/RemoteOnly' 时,我们才会收到自定义错误,并且没有异常,也没有调用 Application_Error。我可以在 Error.cshtml 中的Layout = null 行中捕捉到这一点。例外是在问题中,缺少脚本部分。

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

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

                    【讨论】:

                      【解决方案15】:

                      基本是在_Layout.cshtml没有的时候出现:

                      @RenderSection("scripts", required: false)
                      

                      或与

                      @RenderSection("scripts")  
                      

                      没有

                      required: false
                      

                      所以,只需添加 @RenderSection(“脚本”,必需:假) 在 _Layout.cshtml 中 它特别适用于那些使用 Kendoui 生成的项目的开发人员。

                      【讨论】:

                        【解决方案16】:

                        在使用 Visual Studio 2012 完成 ASP.NET MVC 4 教程时,我在“从控制器部分访问模型的数据”中遇到了同样的错误。修复很简单。

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

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

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

                            @RenderSection("scripts", required: false)
                        

                        【讨论】:

                          【解决方案17】:

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

                          问题 #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。

                          【讨论】:

                          • 同意,OP 的评论是他删除了一个部分以解决错误,这意味着他在视图中定义了一个部分,但不是在布局中,而不是大多数答案地址(与他们描述的错误相对应的问题#2)所有其他答案都描述了不会产生该错误的情况,而是“未定义部分”而不是“已定义部分但......未呈现” .
                          【解决方案18】:

                          我有一个 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 内部我正在定义该部分。可以吗?
                          • 今天我通过这里的代码示例学习了如何做“中间布局”。 @section Foo {@RenderSection("Foo")}“传递”这些部分!还必须用@RenderBody()传递尸体。
                          • 非常聪明:)))
                          【解决方案19】:

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

                          @RenderSection("scripts", required: false)
                          

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 2016-04-25
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            相关资源
                            最近更新 更多