2010-11-17 103 views
15

這裏違約一節就是我試圖解決的情況:在Razor視圖

我有一個單節@RenderSection(「菜單」),主共享的佈局,我想默認爲標準菜單對於我的大部分頁面,但我想在幾個子頁面中替換/覆蓋該部分。在遊戲的這個階段,Razor可以實現嗎?

我希望我可以在_ViewStart.cshtml中定義該部分的默認實現,但它似乎並不喜歡它。

菜單局部視圖會更適合這種情況嗎?

編輯:

我得到下面的錯誤與下面這段代碼:以下各節已確定,但尚未呈現的頁面佈局「〜/查看/共享/ _Layout.cshtml」:「菜單」。

_Layout.cshtml

  <div id="menu"> 
@if (IsSectionDefined("menu")) 
{ 
    RenderSection("menu"); 
} 
else { 
    <text> 
      <ul> 
       <li>@Html.ActionLink("Home", "Index", "Home")</li> 
       <li><a href="#">Lookups</a> 
        <ul> 
         @Html.ActionLink("Product","Index","Product") 
        </ul> 
       </li> 
      </ul> 
    </text> 
} 
     </div> 

Index.cshtml

@section menu { 
      <ul> 
       <li>@Html.ActionLink("Product", "Index", "Product")</li> 
       <li>@Html.ActionLink("Form Type", "Index", "Product")</li> 
       <li>@Html.ActionLink("Supplier", "Index", "Product")</li> 
      </ul> 
    } 

回答

23

啊......我被這個搞亂,發現我可以就在切換邏輯做到這一點:

@RenderSection("Header", false) 
@if (!IsSectionDefined("Header")) { 
<header> 
    Default Header! 
</header> 
} 

所以,如果我的網頁沒有定義@section Header { ... },它呈現的默認值。

+0

謝謝安迪。這對我來說效果很好,我認爲它比單獨的菜單部分清潔一點。 – 2010-12-08 19:47:56

19

IsSectionDefined方法應該適合你的需求:

@if(IsSectionDefined("Menu")) { 
    @RenderSection("Menu") 
} else { 
    <text> 
     Default Menu Content. 
    </text> 
} 

更新:我寫了一篇博客文章,以更好地說明可用選項:http://blogs.msdn.com/b/marcinon/archive/2010/12/08/Optional-Razor-Sections-with-Default-Content.aspx

+0

謝謝,我已經給它一個去了,但我得到:以下部分已定義,但尚未呈現佈局頁面「〜/ Views/Shared/_Layout.cshtml」:「菜單」。我會將我的代碼添加到OP中以顯示我所做的事情。 – 2010-11-17 21:53:14

+2

我更新了代碼以解決問題。你需要執行'@RenderSection()'而不是'RenderSection()' – marcind 2010-12-10 23:20:30

3

我目前使用多種佈局來實現這個完全相同的場景。

/Views/Shared/_Layout.cshtml

<html> 
    ... 
    <body> 
    <div id="menu">@RenderSection("Menu", required:false)</div> 
    ... 
    @RenderBody() 
    ... 
    </body> 
</html> 

/Views/Shared/_LayoutWithDefaultMenu.cshtml

@{ Layout = "~/Views/Shared/_Layout.cshtml"; } 
@section Menu { @Html.Partial("Menu") } 
@RenderBody() 

/Views/_ViewStart.cshtml

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

這意味着,默認情況下,我的所有視圖都會使用默認菜單獲取佈局。但是,在逐個視圖的基礎上,我可以將佈局設置爲_Layout.cshtml,然後自己執行@section Menu

+0

我試過這兩種方法,儘管我認爲另一種方法比較乾淨,但是在另一種方法中我工作的時候,編輯。 – 2010-11-18 00:56:18