MVC 3 — Вложенные макеты — разделы не отображаются в областях

#asp.net-mvc-3 #razor

#asp.net-mvc-3 #бритва

Вопрос:

Проблема:

Учитывая эту вложенную структуру макета:

~/Views/Shared/_layoutBase.cshtml
~/Views/Shared/_layout.cshtml

Где _layoutBase.cshtml находится макет для _layout.cshtml .

Любые разделы, определенные в файлах макета, отлично отображают свое содержимое на страницах под ~/Views/...

Однако для представлений в области разделы никогда не отображаются.

Настройка:

_layoutBase :

 <script type="text/javascript">
        @RenderSection("footerScripts", false)
    </script>
</body>
</html>
  

_layout.cshtml :

 @section footerScripts{
    @RenderSection("footerScripts", false)
}
  

представление «содержимое»:

 @section footerScripts{
$(function () {
    SetFocusOnForm("CaptchaCode", "NextButton");
});
}
  

Содержимое раздела footerScripts никогда не отображается в представлении в области. Он отображается в представлении, которое находится под ~/Views папкой.

Область _ViewStart.cshtml :

 @{
    Layout = "~/Views/Shared/_Layout.cshtml";
} 
  

Вопрос:

Вы видите что-нибудь не так ?!

Ответ №1:

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

  1. Создайте новый ASP.NET Приложение MVC 3 с использованием шаблона интернет-приложения
  2. Добавить ~/Views/Shared/_LayoutBase.cshtml :

     <!DOCTYPE html>
    <html>
    <body>
    @RenderBody()
    <script type="text/javascript">
        @RenderSection("footerScripts", false)
    </script>
    </body>
    </html>
      
  3. Замените содержимое ~/Views/Shared/_Layout.cshtml на это:

     @{
        Layout = "~/Views/Shared/_LayoutBase.cshtml";
    }
    
    @section footerScripts{
        @RenderSection("footerScripts", false)
    }
    
    @RenderBody()
      
  4. Щелкните правой кнопкой мыши по проекту и добавьте область администратора

  5. Добавьте TestController в эту область администрирования и добавьте соответствующее ~/Areas/Admin/Views/Test/Index.cshtml представление:

     @{
        ViewBag.Title = "Index";
        Layout = "~/Views/Shared/_Layout.cshtml";
    }
    
    <h2>Index</h2>
    
    @section footerScripts{
        alert('ok');
    }
      
  6. Запустите приложение и перейдите к /admin/test/index
  7. Отображается предупреждение

Комментарии:

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

2. Как раз то, что я искал. Вложенный рендеринг внутри макетов… Спасибо!

3. В дополнение к этому, если вы хотите добавить область, например, «admin», вы можете просто добавить это в _ViewStart.cshtml области @{ Layout = «~/Views/ Shared/_AdminLayout.cshtml»; } Добавьте _AdminLayout.cshtml из корневой общей папки, котораявыглядит так. @{ Layout = «~/Views/Shared/_LayoutBase.cshtml»; } @нижние колонтитулы раздела{ @RenderSection(«Нижние колонтитулы», false) } @RenderBody()

Ответ №2:

Причина, по которой:

Я встал сегодня утром и сразу увидел проблему:

У меня были блоки @section в частичном представлении. В MVC 3 это НЕ сработает!!

АГА!

Я действительно ценю усилия Дарина, которые эффективно доказали, что разделы работают в областях, как и ожидалось. Но настоящая причина заключалась в этом.

Я забыл, что они были в частичном представлении, потому что у меня есть мастер mvc 3, который использует частичные представления для шагов. Это работает так хорошо и последовательно, используя ajax, если доступен javascript, что вы забываете, что делаете.

Пожалуйста, проголосуйте за Дарина, но это реальный ответ.

Комментарии:

1. Если это решило вашу проблему, вы должны принять свой собственный ответ.