Frage

Hier ist die Situation, die ich zu lösen versuche:

Ich habe ein gemeinsames freigegebenes Layout mit einem einzelnen Abschnitt @Rendersektion ("Menü"), das ich für die Mehrheit meiner Seiten standardmäßig in ein Standardmenü verwenden möchte, aber ich möchte diesen Abschnitt in einigen Teilseiten ersetzen/überschreiben. Ist das mit Razor in dieser Phase des Spiels möglich?

Ich hatte gehofft, ich könnte möglicherweise die Standardimplementierung dieses Abschnitts in _viewStart.cshtml definieren, aber es scheint es nicht zu mögen.

Wäre ein Menü teilweise Ansicht für diese Situation besser?

Bearbeiten:

Ich erhalte jetzt den folgenden Fehler mit diesem Code: Die folgenden Abschnitte wurden definiert, wurden jedoch nicht für die Layout -Seite "~/views/freigegeben/_layout.cshtml": "Menü".

_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>
    }
War es hilfreich?

Lösung

Ah ... Ich habe mich damit herumgespielt und festgestellt, dass ich es tun konnte, indem ich einfach die Logik umschaltete:

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

Also, wenn meine Seiten nicht definieren @section Header { ... }, es macht den Standard.

Andere Tipps

das IsSectionDefined Methode sollte Ihre Bedürfnisse erfüllen:

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

Aktualisieren: Ich habe einen Blog -Beitrag geschrieben, um die verfügbaren Optionen besser zu veranschaulichen: http://blogs.msdn.com/b/marcinon/archive/2010/12/08/optional-razor-sections-with-default-content.aspx

Ich verwende derzeit mehrere Layouts, um genau das gleiche Szenario zu erreichen.

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

Dies bedeutet, dass alle meine Ansichten standardmäßig das Layout mit einem Standardmenü erhalten. Auf der Basis von Blick auf Ansicht kann ich das Layout jedoch festlegen _Layout.cshtml und dann implementieren @section Menu mich selbst.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top