Ответ 1
То, что вы пытаетесь сделать, в настоящее время не поддерживается в Razor. Разделы работают только между страницей просмотра и ее непосредственной страницей макета.
У меня есть частичная "боковая панель", добавленная к главной странице (макет), и внутри этого частичного я использую:
@RenderSection("SearchList", required: false)
В одном из представлений, которое использует главную страницу, которую я делаю:
@section SearchList {
// bunch of html
}
но это дает мне ошибку:
Файл "~/Views/Shared/_SideBar.cshtml" не может быть запрошен напрямую, потому что он вызывает метод IsSectionDefined.
Что здесь не так?
То, что вы пытаетесь сделать, в настоящее время не поддерживается в Razor. Разделы работают только между страницей просмотра и ее непосредственной страницей макета.
При создании вида макета вы можете поместить отдельные фрагменты в частичные виды.
Вы также можете столкнуться с необходимостью отображения разделов, которые необходимо поместить в разметку одного из этих частичных представлений. Однако, поскольку частичные представления не поддерживают логику 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
}
Это можно решить с помощью бритвенных помощников. Это своего рода элегантно-хаки, но это помогло мне.
Итак, в родительском представлении вы определяете помощника:
@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>