Razor — вставить один и тот же раздел более одного раза

#.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:

Я мог бы воспроизвести проблему на своей стороне, кажется, что мы не можем отобразить один и тот же раздел более одного раза. В качестве альтернативного решения я предлагаю вам попробовать использовать следующий метод для отображения содержимого:

  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...
     }
     
  2. Использование частичного просмотра:
      <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 используйте частичный тег и поместите свой повторно используемый код в это частичное представление.