Domanda

Ecco la situazione che sto cercando di risolvere:

Ho un layout condiviso principale con una singola sezione @RendeRection ("menu") che voglio inadempiere a un menu standard per la maggior parte delle mie pagine, ma vorrei sostituire/sovrascrivere quella sezione in alcune seconde pagine. È possibile con Razor in questa fase del gioco?

Speravo di poter definire l'implementazione predefinita di quella sezione in _viewstart.cshtml, ma non sembra che lo piacesse.

Una vista parziale menu sarebbe migliore per questa situazione?

Modificare:

Sto ricevendo il seguente errore con questo codice ora: le seguenti sezioni sono state definite ma non sono state rese per la pagina di layout "~/views/condiviso/_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>
    }
È stato utile?

Soluzione

Ah ... stavo scherzando con questo e ho scoperto che potevo farlo semplicemente cambiando la logica:

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

Quindi se le mie pagine non definiscono @section Header { ... }, rende il valore predefinito.

Altri suggerimenti

Il IsSectionDefined Il metodo dovrebbe soddisfare le tue esigenze:

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

Aggiornare: Ho scritto un post sul blog per illustrare meglio le opzioni disponibili: http://blogs.msdn.com/b/marcinon/archive/2010/12/08/optional-razor-section-with-default-content.aspx

Attualmente sto usando più layout per ottenere lo stesso identico scenario.

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

Ciò significa che, per impostazione predefinita, tutte le mie viste ottengono il layout con un menu predefinito. Tuttavia, su base visiva per vista, posso impostare il layout su _Layout.cshtml e poi implementa @section Menu me stesso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top