#.net #asp.net-core #razor
#.net #asp.net-core #razor
Вопрос:
На странице:
@section NavLinks {
some content here...
}
В макете:
<div class="NavLinks">
@await RenderSectionAsync("NavLinks", required: false)
</div>
<div id="MainContent">
@RenderBody()
</div>
<div class="NavLinks">
@await RenderSectionAsync("NavLinks", required: false)
</div>
И приводит к:
InvalidOperationException: RenderSectionAsync invocation in '/Pages/Shared/_Layout.cshtml' is invalid. The section 'NavLinks' has already been rendered.
Microsoft.AspNetCore.Mvc.Razor.RazorPage.RenderSectionAsyncCore(string sectionName, bool required)
WebSite.Pages.Shared.Pages_Shared__Layout.<ExecuteAsync>b__14_1() in _Layout.cshtml
@await RenderSectionAsync("NavLinks", required: false)
Есть идеи, как заставить это работать?
Ответ №1:
Я мог бы воспроизвести проблему на своей стороне, кажется, что мы не можем отобразить один и тот же раздел более одного раза. В качестве альтернативного решения я предлагаю вам попробовать использовать следующий метод для отображения содержимого:
- Используя другое имя раздела, код, как показано ниже:
<div class="NavLinks"> @await RenderSectionAsync("Top_NavLinks", required: false) </div> <div id="MainContent"> @RenderBody() </div> <div class="NavLinks"> @await RenderSectionAsync("Footer_NavLinks", required: false) </div>
и определить их в представлении страниц Razor:
@section Top_NavLinks { some content here... } @section Footer_NavLinks { some content here... }
- Использование частичного просмотра:
<div class="NavLinks"> <partial name="_NavLinks.cshtml" /> </div> <div class="container"> <main role="main" class="pb-3"> @RenderBody() </main> </div> <div class="NavLinks"> <partial name="_NavLinks.cshtml" /> </div>
Затем добавьте некоторый код в частичное представление (_NavLinks.cshtml), например:
<ul> <li><a href="#">Hyper Link</a></li> <li><a href="#">Hyper Link</a></li> <li><a href="#">Hyper Link</a></li> </ul>
Результат выглядит следующим образом:
Наконец, для использования одного и того же раздела более одного раза я предлагаю вам попробовать отправить отзыв.
Комментарии:
1. Одним из больших недостатков этого метода является то, что необходимо копировать и вставлять содержимое в оба раздела.
2. Да, при использовании другого имени раздела нам приходится копировать содержимое в оба раздела. Вы могли бы рассмотреть возможность использования частичного представления для отображения содержимого, таким образом, мы могли бы добавить только два
<partial>
тега.3. Интересно, можно ли присвоить переменной HTML, отображаемый разделом.
4. @user626528 «если возможно присвоить HTML-код, отображаемый разделом, переменной» Я также проверил это, проверил, но, к сожалению, он все еще не работает. Похоже, что это встроенное поведение. Итак, в настоящее время вы можете использовать вышеуказанные методы в качестве альтернативного обходного пути.
Ответ №2:
Вопрос относится к разделу ИЛИ к фрагменту кода Razor? Вместо RenderSection используйте частичный тег и поместите свой повторно используемый код в это частичное представление.