Hoje durante o trabalho tive uma dúvida da maneira de implementar uma forma de criar um bloco no arquivo Layout, ou na MasterPage (WebForms) que fosse sobrescrito por uma seção que esteja definido na view.
De uma maneira ilustrativa, eu precisava definir um rodapé no arquivo Layout que será utilizado em varias partes do site, entretanto, caso eu precise, irei sobrescrever esse rodapé na View.
ASP.NET WebForms
Usando ASP.NET WebForms eu implementaria usando ContentPlaceHolder na MasterPage:
<div class="footer">
<asp:ContentPlaceHolder runat="server" ID="cphFooter">
<p>
Rodapé Default</p>
</asp:ContentPlaceHolder>
</div>
E caso eu precise sobrescrever esse rodapé na página eu uso um Content, definindo como ContentPlaceHolderID o id do ContentPlaceHolder da MasterPage
<asp:Content ID="FooterContent" runat="server" ContentPlaceHolderID="cphFooter">
<p>
Rodapé customizado</p>
</asp:Content>
ASP.NET MVC3 + Razor
Para implementar esse comportamento usando Razor em meu projeto, eu precisei utilizar um método chamado IsSectionDefined que fica na namespace System.Web.WebPages.
Minha implementação ficou da seguinte forma:
No arquivo _Layout.cshtml
<div id="footer">
@if (IsSectionDefined("RodapeCustom"))
{
@RenderSection("RodapeCustom")
}
else
{
<p>Rodapé Default</p>
}
</div>
Agora, na View que eu precisar customizar o rodapé, só será necessário criar uma Section com o nome RodapeCustom
Na Index.cshtml
@section RodapeCustom{
<p>Rodapé custom</p>
}
Abaixo seguem os dois projetos para download
Espero que esta dica seja útil
abs
Rodolfo

