Подтвердить что ты не робот

RenderSection() внутри частичного с главной страницей

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

@RenderSection("SearchList", required: false)

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

@section SearchList {
    // bunch of html
}

но это дает мне ошибку:

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Вы также можете столкнуться с необходимостью отображения разделов, которые необходимо поместить в разметку одного из этих частичных представлений. Однако, поскольку частичные представления не поддерживают логику 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
}

Ответ 3

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

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

@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;
}

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

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

<div><blink>Attention!</blink></div>