RenderSection () внутри частичного с главной страницей - PullRequest
29 голосов
/ 30 января 2011

У меня есть частичная «Боковая панель», добавленная на главную страницу (макет), и внутри этой части я использую:

@RenderSection("SearchList", required: false)

В одном из представлений, использующих главную страницу, которую я делаю:

@section SearchList {
    // bunch of html
}

но выдает ошибку:

Файл "~ / Views / Shared / _SideBar.cshtml" не может быть запрошен напрямую, потому что он вызывает метод IsSectionDefined.

Что здесь не так?

Ответы [ 3 ]

23 голосов
/ 30 января 2011

То, что вы пытаетесь сделать, в настоящее время не поддерживается в Razor. Разделы работают только между страницей просмотра и страницей непосредственного макета.

15 голосов
/ 04 июня 2014

При создании вашего макета вы можете захотеть поместить некоторые части отдельно в частичные виды.

Вы также можете столкнуться с необходимостью визуализации разделов, которые необходимо поместить в разметку одного из этих частичных представлений.Однако, поскольку частичные представления не поддерживают логику RenderSection, вам придется обойти это.

Вы можете визуализировать разделы в частичных представлениях, передавая результат RenderSection со своей страницы макета в качестве модели частичного представления.Вы можете сделать это, поместив эту строку кода в свой _Layout.cshtml.

_Layout.cshtml

@{ Html.RenderPartial("_YourPartial", RenderSection("ContextMenu", false));}

Затем в _YourPartial.cshtml вы можете отобразить переданный раздел как модель в вызове Html.RenderPartial в представлении _Layout.Вы проверяете, является ли модель нулевой, на тот случай, если ваш раздел не требуется.

_YourPartial.cshtml

@model HelperResult
@if (Model != null)
{
    @Model
}
4 голосов
/ 20 августа 2015

Это можно решить с помощью бритвенных помощников. Это своего рода элегантно-хакерский ™, но он сделал работу для меня.

Итак, в родительском представлении вы определяете помощника:

@helper HtmlYouWantRenderedInAPartialView()
{
    <blink>Attention!</blink>
}

Затем при рендеринге частично вы передаете этому помощнику

@Html.Partial("somePartial", new ViewDataDictionary { { "OptionalSection1", (Func<HelperResult>)(HtmlYouWantRenderedInAPartialView) } })

Затем в частичном представлении вы называете этого помощника следующим образом:

<div>@ViewData.RenderHelper("OptionalSection1")</div>

Наконец, вам нужен этот метод расширения для упрощения «вызывающей» части

public static HelperResult RenderHelper(this ViewDataDictionary<dynamic> viewDataDictionary, string helperName)
{
    Func<HelperResult> helper = viewDataDictionary[helperName] as Func<HelperResult>;
    if (helper != null)
    {
        return helper();
    }

    return null;
}

Таким образом, весь смысл в том, чтобы передать делегату этого помощника, а затем, когда дочернее представление вызывает его, содержимое отображается в том месте, где вы хотите.

Конечный результат дочернего представления будет выглядеть следующим образом

<div><blink>Attention!</blink></div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...