3

在我_Layout.cshtmlbody元素的最后一行是:与布局网页上显示脚本奇怪的错误

@RenderSection("Scripts", required: false) 

然而,当我跑我的应用程序,我得到异常:

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

奇怪够了,因为Scripts不是必需的。然后,在我的登录页面,我注释掉以下行:

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

而且应用程序运行良好。这是不是因为jqueryval包是空的,所以视图引擎认为Scripts部分没有在_Layout.cshtml中呈现?我的BundleConfig包含有问题的脚本,它存在于我的Scripts文件夹中,那么可能会出现什么问题?

+1

我不能重现这一点。你碰巧有嵌套的布局页面(这可能会导致错误) –

回答

-1

变化

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

这个

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

如果你想呈现一个视图页面上的脚本,你必须设置

@RenderSection("Scripts", required: true) 
+2

使用'脚本'标签打败了MVC的整个捆绑和缩小功能的目的,我绝对不希望像那样向后移动。然后,'required:true'在我的视图中击败了* optional *脚本部分的目的。 – ProfK

0

这必须工作:

@RenderSection("Scripts", false) 

您也可以在包裹@RenderSection如果块:

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

更新:确保中,RenderSection已经与你的观点定义的区间相同的名称,例如在你的_layout你应该有以下RenderSection

@RenderSection("Scripts", required: false) 

而在其他的观点:

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

如果该名称(在这种情况下Scripts)不匹配,它抛出这个错误:

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

此外,请确保您的_ViewStart.cshtml指向正确的布局:

Layout = "~/Views/Shared/_Layout.cshtml"; 
+0

正常的@RenderSection(“Scripts”,false)'不起作用,我问这个问题是为了找出原因,而不是像第二个例子那样如何解决它。如果'Scripts'是可选的,则MVC运行时应该执行'@if(IsSectionDefined(“scripts”))',而不是我。但是,谢谢,如果我不及时赶到,我可能会使用解决方法。 – ProfK

0

似乎布局页从_ViewStart呈现,而不是直接引用您的View。请确保_Layout是您View直接,即引用:

@{Layout = "~/Views/Shared/_Layout.cshtml";}

+2

我为什么要这样做?那么'_ViewStart'的目的是什么? – ProfK

+0

'ViewStart'是一个特殊的视图,它是从'ViewStartPage'而不是'WebViewPage'派生出来的。而'ViewStartPage'类没有'DefineSection'方法。所以你不能在这个文件中定义部分。 –

+0

'RenderSection'只能使用视图使用它们定义的部分。由于'_ViewStart'在任何请求代码运行之前运行,这就是为什么它在那里不可用。 这是设计。目前'Razor'布局只能使用(渲染)由'view'使用它们定义的'sections'。您不能拥有布局页面的层次结构,并且最外层的布局使用最内层“视图”中定义的“部分”。 –

1

我们认为,你知道第必需品,MVC模板做工精细。当页面中有另一个错误(与RenderSection没有真正关联)时,发生这种奇怪的错误,并且框架反映了错误的错误,而不是显示主错误。看看my recent issue,它来自相关页面中未定义和使用的ViewBag.sth。或者另一个例子可能是this post有时候所有者遇到手机出错!最后一个的答案是相同的,我认为所有者可能通过浏览器帮助来使用变量来填充页面上的数据,并在完成页面呈现之前没有准备好时发生错误。 简单地说,当视图变量未准备好(未枚举或初始化)和调试器向我们显示一个奇怪的错误时,发生这种不相关的错误。因此,您在页面呈现过程中使用了未分配和使用的变量。

解决方案:检查使用的变量(动态变量,如ViewBagViewData)在你的页面上,从主布局文件追踪到最终呈现的页面(包括局部视图),以找出发生了什么。

0

我发布这个答案,因为我没有足够的学分发表评论到你的问题。抱歉。

但你确定,你的登录页面引用了相同的布局页面吗?