Pergunta

Aqui está a situação que estou tentando resolver:

Eu tenho um layout compartilhado principal com uma única seção @RenderSection ("Menu") que quero padrão para um menu padrão para a maioria das minhas páginas, mas gostaria de substituir/substituir essa seção em algumas sub -páginas. Isso é possível com a Razor nesta fase do jogo?

Eu esperava poder definir a implementação padrão dessa seção em _Viewstart.cshtml, mas não parece gostar.

Uma visão parcial do menu seria melhor para essa situação?

Editar:

Estou recebendo o seguinte erro com este código agora: as seções a seguir foram definidas, mas não foram renderizadas para a página de layout "~/Views/Shared/_layout.cshtml": "menu".

_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>
    }
Foi útil?

Solução

Ah ... eu estava mexendo com isso e descobri que poderia fazer isso apenas mudando a lógica:

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

Então, se minhas páginas não definir @section Header { ... }, ele renderiza o padrão.

Outras dicas

o IsSectionDefined O método deve obtenção de suas necessidades:

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

Atualizar: Escrevi uma postagem no blog para ilustrar melhor as opções disponíveis: http://blogs.msdn.com/b/marcinon/archive/2010/12/08/optional-razor-ensction-with-default-content.aspx

Atualmente, estou usando vários layouts para alcançar exatamente esse mesmo cenário.

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

O que isso significa é que, por padrão, todas as minhas opiniões obtêm o layout com um menu padrão. No entanto, em uma base de vista a vista, posso definir o layout como _Layout.cshtml e depois implementar @section Menu Eu mesmo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top