2013-05-17 10 views
12

Wenn ich eine Seite mit:Ist es möglich, Razor-Abschnitte optional zu machen?

<body> 
    @section SomeStuff { 
     <span>This is a section I just addered</span> 
    } 

</body> 

Ist es möglich, dass das Layout nicht diesen Abschnitt machen, oder ist das Gegenteil, wie dies konzeptionell arbeiten sollte. Es scheint, als wäre es nützlich, bestimmte Abschnitte auf einer Seite nicht rendern zu können (es sei denn, ich denke falsch darüber nach).

Edit:

Einschließlich der Fehlermeldung kann hilfreich sein, wenn ich einen Abschnitt in die Haupt Seite gestellt, die Layout Seite schlägt mit: The following sections have been defined but have not been rendered for the layout page "/Views/Layouts/_Layout1.cshtml": "SomeStuff". Als ob es mich zwingt jeden Abschnitt zu machen auf der Seite oder etwas.

In anderen Worten, in Layout.cshtml, ich nicht Anruf @RenderSection, aber in Index.HTML habe ich einen Abschnitt namens SomeStuff definiert. Ist das legal? Scheint so, als zwinge es mich, alle Sektionen auf der Seite zu rendern, aber das scheint so zu sein, dass Sektionen optional sein sollten, nein?

+1

Sie meinen wie eine 'if' Aussage? – musefan

+1

Ich liebe es, Dinge auch zu addieren –

+0

@daveL - große Köpfe denken gleich. – sircodesalot

Antwort

22

Sie können angeben, ob ein Abschnitt erforderlich ist.

@RenderSection("SomeStuff", required: false) 

, wenn Sie es nicht in einer Ansicht rendern, sollte es nicht so wird der Fehler festgestellt, hier

http://weblogs.asp.net/scottgu/archive/2010/12/30/asp-net-mvc-3-layouts-and-sections-with-razor.aspx

+0

Wie kann dies die akzeptierte Antwort sein? Es geht um eine andere Frage!Es ist genau umgekehrt: Ich definiere einen Ausschnitt in der Ansicht, dann benutze ich ihn nicht im Layout - kann ich das machen? – Simone

+0

@ Simone: http://stackoverflow.com/a/8041081/70345 –

0

Sie könnten tun:

@if (condition) { 
    @RenderSection("SomeStuff") 
    } 

oder einfach nur einen conditional statement direkt verwenden, anstatt @RenderSection:

@if (yourCondition) { 
    <span>This is a section I just addered</span> 
} 
+0

Vielleicht mache ich etwas falsch, aber wenn ich den Abschnitt in die * main * Seite setzen, schlägt die * Layout * Seite fehl weil es '@RenderSection (" SomeStuff ")' 'nicht aufruft. Es scheint, als ob Rendering-Abschnitte optional sein sollten, aber es verhält sich nicht wie es ist. – sircodesalot

+0

Ich bekomme 'Die folgenden Abschnitte wurden definiert, aber wurden nicht für die Layoutseite" /Views/Layouts/_Layout1.cshtml "gerendert:" SomeStuff ".' Klingt so, als ob es mich zwingt, den Abschnitt zu rendern. – sircodesalot

+0

@sircodesalot - Ich glaube, das Layout möchte, dass du @RenderSection ("SomeStuff") einfügst ... du könntest deine Bedingung in das Layout einfügen und es dort aufrufen (wie ich es dir gezeigt habe) .... oder benutze einfach '@ if (yourCondition) {} 'in der Seite direkt (kein Abschnitt benötigt), die nicht die' Layout'-Seite beinhaltet. –

6

Für ein bestimmtes Layout nicht bestimmten Abschnitt was Sie benötigen, zu machen etwas wie dieses ist Ihr layout.cshtml

@RenderSection("Somestuff", required:false) 
5

Sie können einen Abschnitt als optional festlegen, indem Sie den erforderlichen Parameter auf false festlegen. Wenn Sie einen optionalen Wrapper-HTML-Code um Ihren Abschnitt einfügen möchten, können Sie auch die Methode IsSectionDefined verwenden.

@if(IsSectionDefined("SideBar")) 
{ 
    <div class="sidebar"> 
     @RenderSection("SideBar", required: false) 
    </div> 
} 
Verwandte Themen