По умолчанию раздел в представлении "Бритва"

Вот ситуация, которую я пытаюсь решить:

У меня есть общий общий макет с одним разделом @RenderSection ( "Меню" ), который я хочу по умолчанию использовать стандартное меню для большинства моих страниц, но я хотел бы заменить/переопределить этот раздел в нескольких подписях страницы. Возможно ли это с помощью Razor на этом этапе игры?

Я надеялся, что могу определить реализацию по умолчанию этого раздела в _ViewStart.cshtml, но ему это не похоже.

Будет ли улучшенный вариант меню в частичной ситуации?

Edit:

Теперь я получаю следующую ошибку с этим кодом: Определены следующие разделы, но не были отображены для страницы макета "~/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>
    }

Ответы

Ответ 1

А... Я возился с этим и обнаружил, что могу это сделать, просто переключая логику:

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

Поэтому, если мои страницы не определяют @section Header { ... }, он отображает значение по умолчанию.

Ответ 3

В настоящее время я использую несколько макетов для достижения такого же сценария.

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

Это означает, что по умолчанию все мои представления получают макет с меню по умолчанию. Тем не менее, в представлении по отдельности я могу установить макет на _Layout.cshtml, а затем реализовать @section Menu сам.