Вопрос

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

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

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

Будет ли меню частичного просмотра лучше для этой ситуации?

Редактировать:

Теперь я получаю следующую ошибку с этим кодом: теперь были определены следующие разделы, но не отображались для страницы макета «~ / Просмотры / Shared / _layout.cshtml»: «Меню».

_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>
    }
Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

/Views/shared/_layout.cshtml.

<html>
  ...
  <body>
    <div id="menu">@RenderSection("Menu", required:false)</div>
    ...
    @RenderBody()
    ...
  </body>
</html>

/Views/mared/_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 себя.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top