#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:
Я не могу воспроизвести проблему. Вот моя настройка и шаги, которые я сделал.
- Создайте новый ASP.NET Приложение MVC 3 с использованием шаблона интернет-приложения
-
Добавить
~/Views/Shared/_LayoutBase.cshtml
:<!DOCTYPE html> <html> <body> @RenderBody() <script type="text/javascript"> @RenderSection("footerScripts", false) </script> </body> </html>
-
Замените содержимое
~/Views/Shared/_Layout.cshtml
на это:@{ Layout = "~/Views/Shared/_LayoutBase.cshtml"; } @section footerScripts{ @RenderSection("footerScripts", false) } @RenderBody()
-
Щелкните правой кнопкой мыши по проекту и добавьте область администратора
-
Добавьте TestController в эту область администрирования и добавьте соответствующее
~/Areas/Admin/Views/Test/Index.cshtml
представление:@{ ViewBag.Title = "Index"; Layout = "~/Views/Shared/_Layout.cshtml"; } <h2>Index</h2> @section footerScripts{ alert('ok'); }
- Запустите приложение и перейдите к
/admin/test/index
- Отображается предупреждение
Комментарии:
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. Если это решило вашу проблему, вы должны принять свой собственный ответ.