Razor – Hiding a Section in a Layout
- by João Angelo
Layouts in Razor allow you to define placeholders named sections where content pages may insert custom content much like the ContentPlaceHolder available in ASPX master pages.
When you define a section in a Razor layout it’s possible to specify if the section must be defined in every content page using the layout or if its definition is optional allowing a page not to provide any content for that section. For the latter case, it’s also possible using the IsSectionDefined method to render default content when a page does not define the section.
However if you ever require to hide a given section from all pages based on some runtime condition you might be tempted to conditionally define it in the layout much like in the following code snippet.
if(condition) {
@RenderSection("ConditionalSection", false)
}
With this code you’ll hit an error as soon as any content page provides content for the section which makes sense since if a page inherits a layout then it should only define sections that are also defined in it.
To workaround this scenario you have a couple of options. Make the given section optional with and move the condition that enables or disables it to every content page. This leads to code duplication and future pages may forget to only define the section based on that same condition.
The other option is to conditionally define the section in the layout page using the following hack:
@{
if(condition) {
@RenderSection("ConditionalSection", false)
}
else {
RenderSection("ConditionalSection", false).WriteTo(TextWriter.Null);
}
}
Hack inspired by a recent stackoverflow question.