По умолчанию раздел в представлении Razor - PullRequest
16 голосов
/ 17 ноября 2010

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

У меня есть основной общий макет с одним разделом @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>
    }

Ответы [ 3 ]

24 голосов
/ 03 декабря 2010

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

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

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

19 голосов
/ 17 ноября 2010

Метод IsSectionDefined должен соответствовать вашим потребностям:

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

Обновление : я написал сообщение в блоге, чтобы лучше проиллюстрировать доступные варианты: http://blogs.msdn.com/b/marcinon/archive/2010/12/08/Optional-Razor-Sections-with-Default-Content.aspx

3 голосов
/ 17 ноября 2010

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

/ 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 значение _Layout.cshtml, а затем сам реализовать @section Menu.

...