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

我發佈這個答案,因爲我沒有足夠的學分發表評論到你的問題。抱歉。

但你確定,你的登錄頁面引用了相同的佈局頁面嗎?