2016-08-02 170 views
4

我試圖擺脫必須在每個創建的剃刀視圖中手動指定佈局路徑的風險。如何在不指定剃刀視圖中的佈局路徑的情況下指定全局MVC佈局

在Razor視圖

所以,你通常會指定視圖/佈局屬性,如:

@{ 
    ViewBag.Title = "About Us"; 
    Layout = "~/Views/Shared/_ContentLayout.cshtml"; 
} 

我有我的所有控制器都繼承了基本的控制器,其中我很想能夠指定這個級別的佈局,或者在app_start等。

對於任何例外,我只是在視圖本身覆蓋它。

經過廣泛的搜索,我還沒有找到任何人能夠做到這一點的證據。

我現在,下一個最好的解決方法是在ViewBag指定此,以保持它的動態,但我仍然需要把一個聲明中的觀點:

@{ 
    Layout = ViewBag.Layout; 
} 

這可能嗎?解決方案?

回答

3

參考:http://weblogs.asp.net/scottgu/asp-net-mvc-3-layouts

由於MVC3有一個約定,其中...

您可以添加一個名爲_ViewStart.cshtml(或_ViewStart.vbhtml爲VB) 文件的\Views文件夾下您的項目:

_ViewStart文件可用於定義您想要在每個視圖的渲染開始時執行的常見視圖代碼。例如,我們可以 我們_ViewStart.cshtml文件中寫代碼編程 設置佈局屬性爲每個視圖是_ContentLayout.cshtml文件 默認:

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

因爲這段代碼在執行每個視圖的開始,我們不再需要 在我們的任何單個視圖文件 (除非我們想覆蓋上面的默認值)之外明確設置佈局。

+0

相信這個回答我的問題,是的,似乎我已經有一個文件,謝謝!但是,這可以應用在控制器的基礎上,即。每個控制器都有一個默認模板? – MikeDub

+0

您也可以在'_ViewStart'中執行此操作。您可以輕鬆完成條件聲明並檢查控制器。取決於控制器,您可以設置適合的「佈局」。 – Nkosi

3

正如Nkosi提到的,​​如果您希望根據控制器調整佈局而不指定視圖中的佈局路徑,則可以在_ViewStart文件中執行條件塊。

但是我發現也適用,是一點點更容易...

  • 將在每個視圖文件夾_ViewStart文件(涉及控制器),你想有一個不同佈局。
  • 查看區域文件夾中更具體的_ViewStart覆蓋全局_ViewStart文件。

Specifying different layouts in each folder

+1

這比我的條件性建議容易得多。我完全錯過了嵌套視圖的開始。 – Nkosi