2010-11-17 4 views
15

Hier ist die Situation Ich versuche zu lösen:Säumigen ist einen Abschnitt in einer Razor Ansicht

ich einen Haupt gemeinsames Layout mit einem einzigen Abschnitt @RenderSection („Menu“), die ich auf ein Standard-Menü auf dem Standard will, muß für die meisten meiner Seiten, aber ich möchte diesen Abschnitt in einigen Unterseiten ersetzen/überschreiben. Ist das mit Razor in diesem Stadium des Spiels möglich?

Ich hatte gehofft, ich könnte möglicherweise die Standardimplementierung dieses Abschnitts in _ViewStart.cshtml definieren, aber es scheint nicht zu mögen.

Wäre eine teilweise Menüansicht für diese Situation besser?

Edit:

Ich bin mit diesem Code den folgenden Fehler bekommen nun: In den folgenden Abschnitten definiert wurden, jedoch für die Layout-Seite „~/Ansichten/Shared/_Layout.cshtml“ gerendert nicht: " Speisekarte".

_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> 
    } 

Antwort

23

Ah ... Ich war mit dieser Unordnung und ich fand es um nur durch Umschalten der Logik tun könnte:

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

Also, wenn meine Seiten nicht definieren @section Header { ... }, es macht die Standardeinstellung.

+0

Danke Andy. Das hat gut für mich funktioniert und ich denke, es ist ein wenig sauberer als das separate Menü teilweise. –

19

Die IsSectionDefined Methode Suite Ihre Bedürfnisse sollten:

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

Update: Ich schrieb einen Blog-Beitrag, um die verfügbaren Optionen besser zu veranschaulichen: http://blogs.msdn.com/b/marcinon/archive/2010/12/08/Optional-Razor-Sections-with-Default-Content.aspx

+0

Danke, ich habe es gegeben, aber ich bekomme: Die folgenden Abschnitte wurden definiert, wurden aber nicht für die Layoutseite "~/Views/Shared/_Layout.cshtml": "menu" gerendert. Ich füge meinen Code zu meinem OP hinzu, um zu zeigen, was ich getan habe. –

+2

Ich habe den Code aktualisiert, um das Problem zu beheben.Sie müssen '@RenderSection()' anstelle von nur 'RenderSection()' – marcind

3

Ich verwende derzeit mehrere Layouts, um genau dasselbe Szenario zu erreichen.

/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"; } 

Das bedeutet, dass standardmäßig alle Ansichten das Layout mit einem Standardmenü erhalten. Jedoch kann ich das Layout für jede einzelne Ansicht auf _Layout.cshtml setzen und dann selbst @section Menu implementieren.

+0

Ich versuchte beide Ansätze und obwohl ich denke, der andere Ansatz ist sauberer, deins arbeitete, während in der anderen ich den Fehler bekomme ich oben erwähnt in der bearbeiten. –

Verwandte Themen