Следующие разделы были определены, но не отображены для страницы макета «~ / Views / Shared / _Layout.cshtml»: «Scripts»

101

Я новичок в ASP MVC и использую учебник Intro to ASP MVC 4 Beta http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/intro-to-aspnet -mvc-4

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

Я нахожусь в разделе «Доступ к данным вашей модели из контроллера», и я получаю эту ошибку, когда пытаюсь создать фильм в рамках учебного курса, я нажимаю ссылку «Создать новый» и получаю следующую ошибку

Следующие разделы были определены, но не были обработаны для страницы макета> "~ / Views / Shared / _Layout.cshtml": "Scripts"

Вместо использования Visual Studio Express я решил загрузить Visual Studio 2012 RC (не уверен, что это будет основной причиной моей проблемы.

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

Спасибо,

Кевин Дарк
источник
Вы должны следовать версии этого руководства для Visual Studio 2012 asp.net/mvc/tutorials/mvc-4/…
RickAndMSFT,
1
У меня была такая же проблема, и моя проблема была решена, когда я взял RenderSection из @ {} и использовал только @. Понятия не имею, почему это происходит
Гильерме Феррейра
1
Ссылка в Rick и комментарий выше у меня не работает. Но что более важно, это не учебная проблема, это проблема генерации кода VS, которую легко исправить, и ее не следует просто скрывать, удаляя сбойную строку, как предлагают многие ответы ниже принятого. См. Мой ответ ( stackoverflow.com/a/27152625/165164 ) ниже для обсуждения того, что на самом деле происходит - по крайней мере, для некоторых версий VS.
Anne Gunn
Указанная ошибка возникает, когда представление определило объект, @sectionкоторый НЕ отображается в макете (с RenderSection). Это может произойти, если вы указали неправильную Layoutссылку или вообще забыли сослаться на макет. См . Ответ @ vonv
StuartLC

Ответы:

147

Это означает, что вы определили раздел в своем основном Layout.cshtml, но вы не включили ничего для этого раздела в свое представление.

Если в вашем _Layout.cshtml есть что-то вроде этого:

@RenderSection("scripts")

Затем все представления, использующие этот макет, должны включать в себя объект @sectionс тем же именем (даже если содержимое раздела пусто):

@{
    ViewBag.Title = "Title";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
@section scripts{
    // Add something here
}

В качестве альтернативы вы можете установить для required значение false, тогда вам не нужно будет добавлять раздел в каждый View,

@RenderSection("scripts", required: false)

или также вы можете обернуть его @RenderSectionв ifблок,

@if (IsSectionDefined("scripts"))
{
    RenderSection("scripts");
}
мгнунан
источник
7
Ваш ответ был полезен. Я не обнаружил никаких @RenderSection ("Scripts") в _Layout.cshtml, но я заметил в представлениях, которые были автоматически созданы при создании моего контроллера Movies для этого руководства, что в них были @section Scripts {@ Scripts.Render (" ~ / bundles / jqueryval ")} Я удалил их на данный момент, и пока все работает.
Кевин Дарк
23
пока ваш ответ хорош. Я думаю, вы должны указать, что добавление , required: false)создания @RenderSection("scripts", required: false)позволит включить его или нет.
Eonasdan
3
@ KDark11 При создании представления VS спрашивает, хотите ли вы ссылаться на скрипты. Просто снимите галочку.
Eonasdan
1
Я согласен с тем, что @RenderSection("scripts", required: false)вставка в сгенерированный _Layout.cshtml - правильное решение. (См. Объяснение ниже, почему.) Таким образом вы можете добавить исправление в один файл, а не во все - в основном исправление DRYer.
Anne Gunn
@Eonasdan, это круто! когда они добавили эту функцию? пожалуйста, не говори мне v1.0: - /
Simon_Weaver
26

Также вы можете добавить следующую строку в _Layout.cshtmlили _Layout.Mobile.cshtml:

@RenderSection("scripts", required: false)
Хуан Карлос Пуэрто
источник
25

У меня был случай с 3 уровнями a'la _ MainLayout.cshtml <--- _ Middle.cshtml <--- Page.cshtml . Хотя делаю вот так:

_MainLayout.cshtml

<head>
   @RenderSection("head", false)
</head>

_Middle.cshtml

@section head {
    @RenderSection("head")
}

и в Page.cshtml определяя

@section head {
   ***content***
}

Я бы все равно получил ошибку

Следующие разделы были определены, но не были обработаны для страницы макета «~ / Views / Shared / _Middle.cshtml»: «head».

Оказалось, ошибка заключалась в том, что Middle.cshtml полагался на /Views/_ViewStart.cshtml для разрешения его родительского макета. Проблема была решена путем явного определения этого в Middle.cshtml :

@{
Layout = "~/Views/_Shared/_MainLayout.cshtml";
}

Не могу решить, было ли это задумкой или ошибкой в ​​MVC 4 - все равно проблема была решена :)

Фредерик Штрук-Шёнинг
источник
У меня такая же проблема. Дело в том, что я вызываю RenderSection перед RenderBody, а внутри Body Content я определяю раздел. Может быть?
Гильерме Феррейра
1
Сегодня я научился делать "средний макет" благодаря примеру кода здесь. @section Foo {@RenderSection("Foo")}«пропустить» разделы! Также пришлось сдать кузов с @RenderBody().
starlocke
очень умно :)))
ehsan
11

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

Выпуск # 1

На главной странице (например _Layout.cshtml) есть определенный раздел, и он является обязательным, но наследующие представления не реализовали его. Например,

Шаблон макета

<body>
    @* Visible only to admin users *@
    <div id="option_box"> 
        @* this section is required due to the absence of the second parameter *@
        @RenderSection("OptionBox") 
    </div>
</body>

Наследующий вид

Нет необходимости показывать какой-либо код, просто учтите, что в представлении нет реализации @section OptionBox {}.

Ошибка для выпуска №1

Section not defined: "OptionBox ".

Выпуск # 2

На главной странице (например _Layout.cshtml) есть определенный раздел, и он является обязательным, И наследующее представление его реализовало. Однако реализующее представление имеет дополнительные scriptразделы, которые не определены (ни на одной из) его главных страниц.

Шаблон макета

same as above

Наследующий вид

<div>
  <p>Looks like the Lakers can still make it to the playoffs</p>
</div>
@section OptionBox {
<a href"">Go and reserve playoff tickets now</a>
}
@section StatsBox {
<ul>
    <li>1. San Antonio</li>
    <li>8. L. A. Lakers</li>
</ul>
}

Ошибка для выпуска №2

The following sections have been defined but have not been rendered for the layout page "~/Views/Shared/_Layout.cshtml": "StatsBox"

Проблема OP аналогична проблеме № 2, и принятый ответ относится к проблеме № 1.

фон v.
источник
3
Согласен, комментарий OP заключается в том, что он удалил раздел с целью устранения ошибки, что означает, что у него был раздел, определенный в представлении, но не в макете, а не наоборот, поскольку большинство ответов адресовано (Проблема № 2, которая соответствует ошибка, которую они описывают) Все остальные ответы описывают ситуацию, которая не приведет к возникновению этой ошибки, но вместо этого «Раздел не определен», а не «разделы были определены, но ... не отображены».
AaronLS
9

Я думаю, что наше решение существенно отличалось от всех остальных, поэтому я задокументирую его здесь.

У нас есть настройка основного макета, промежуточного макета, а затем финального рендеринга страницы действия. Main.cshtml <- Config.cshtml <- Action.cshtml

Только когда web.config имел customErrors='On/RemoteOnly'пользовательскую ошибку, и не было вызвано никаких исключений Application_Error. Я мог уловить это Layout = nullв файле Error.cshtml. Исключение было, как в вопросе, раздел отсутствующих скриптов.

У нас он был определен в Main.cshtml (с required: false), а Action.cshtml не содержал ничего, что было написано в разделе скриптов.

Решение было добавить @section scripts { @RenderSection("scripts", false) }в Config.cshtml.

Паси Саволайнен
источник
7

Обычно это происходит, когда _Layout.cshtml не содержит:

@RenderSection("scripts", required: false)

или с

@RenderSection("scripts")  

БЕЗ

required: false

Итак, просто добавьте @RenderSection ("scripts", обязательно: false) в _Layout.cshtml, и он будет работать специально для тех разработчиков, которые работают с проектами, созданными Кендоуи.

JMJ
источник
7

Похоже, что существует несоответствие между файлами просмотра, которые некоторые версии Visual Studio автоматически генерируют для вас, когда вы используете его для создания новой модели. Я столкнулся с этой проблемой, используя новую версию VS 2013 Community Edition и просматривая учебник W3Schools на http://www.w3schools.com/aspnet/mvc_app.asp, но комментарии выше показывают, что это не проблема с инструкциями руководства или с единая версия VS.

Это правда , что вы можете сделать сообщение об ошибке исчезнет , только удаление

@Scripts.Render("~/bundles/jqueryval")

строка из макетов создания / редактирования, которые были автоматически созданы Visual Studio.

Но это решение не устраняет основную причину и не дает вам возможности сделать больше, чем завершить изучение руководства. В какой-то момент (вероятно, довольно рано) в разработке реального приложения вам понадобится доступ к коду проверки jquery, который решение для комментирования удаляет из вашего приложения.

Если вы используете VS для создания новой модели, он также создает набор из пяти файлов просмотра: Create, Delete, Details, Edit и Index. Два из этих представлений, Create и Edit, позволяют пользователю добавлять / редактировать данные для полей в записях базы данных, которые лежат в основе модели. Для этих представлений в реальном приложении вы, вероятно, захотите выполнить некоторый объем проверки данных с помощью библиотеки проверки jquery, прежде чем сохранять запись в db. Вот почему VS добавляет следующие строки

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

к нижней части этих двух представлений, а не других. Автоматически сгенерированный код пытается сделать библиотеку проверки доступной для этих представлений, но не для других.

Ошибка возникает из-за того, что VS либо не добавляет соответствующую строку в общий файл _Layout.cshtml, либо, см. Один ответ выше, добавляет ее, но оставляет ее закомментированной. Эта линия

@RenderSection("scripts", required: false)

Если в некоторых из ваших представлений есть раздел сценариев (как в случае создания и редактирования), в макет должна быть встроена команда RenderSection. Если в некоторых сценариях есть раздел, а в некоторых нет (как, например, Delete, Details и Index), команда RenderSection должна иметь required: falseпараметр.

Итак, лучшее решение, если вы хотите сделать что-то большее, чем просто закончить изучение руководства, - это добавить оператор в _Layout.cshtml, а не удалять код из представлений Edit и Create.

PS Это немного сбивает с толку, здесь то, что требуется, находится в «пакете», а оператор require выглядит так, как будто он пытается включить файл в папку пакетов, которая не существует в вашем проекте. Но для отладочных сборок и руководств это не актуально, поскольку связанные файлы включаются по одному. См .: http://www.asp.net/mvc/overview/performance/bundling-and-minification . Код, о котором идет речь, кратко упоминается примерно на двух третях страницы.

Энн Ганн
источник
Это «качает» и является действительно хорошим объяснением. Возможно, это пришло позже, поэтому не
набралось
2

Во время работы с учебником по ASP.NET MVC 4 с Visual Studio 2012 я обнаружил ту же ошибку в разделе «Доступ к данным вашей модели из контроллера». Исправить довольно просто.

При создании нового веб-приложения ASP.NET MVC 4 в Visual Studio 2012 в документе _Layout.cshtml в общей папке раздел «сценарии» закомментирован.

    @*@RenderSection("scripts", required: false)*@

Просто не комментируйте строку, и образец кода должен работать.

    @RenderSection("scripts", required: false)
Рик М.
источник
1

У меня такая же проблема при реализации учебника для начинающих MVC. У меня было несколько предложений по изменению @RenderSection в вашем файле layout.cshtml, но я не использовал его.

Я много искал, а потом обнаружил, что тег скрипта, созданный в (View / Edit.cshtml) и другом файле cshtml, не отображает

**@section Scripts {
@Scripts.Render("~/bundles/jqueryval")

} **

Я удалил эти строки, и приложение начало работать нормально.

Теджас Савант
источник
1

У меня такое ощущение, что вы визуализируете свой раздел из @section в файле _Layout, который ссылается на частичное представление с @section, то есть вы вложили @section в @section. В файле _Layout удалите @section вокруг рендеринга.

Андрей Магасинер
источник
1

Я также прокомментировал ** @ section Scripts, что все работает нормально. :)

Паллави
источник
Спасибо. Помогло :)
noobprogrammer
0

Я поискал ошибку в сети и зашел на эту страницу. Я использую Visual Studio 2015, и это мой первый проект MVC.

Если вы пропустите символ @ перед разделом рендеринга, вы получите ту же ошибку. Хочу поделиться этим с будущими новичками.

 @RenderSection("headscripts", required: false)
CodeName47
источник
0

Я решил эту проблему, используя следующее:

@await Html.PartialAsync("_ValidationScriptsPartial")
Эктор Боррего
источник
0

Для меня проблема была в моем _Layout.cshtml, у меня есть RenderSection внутри условия

 @if (theme == "Red" || theme == "Green")
  {
       <div>
       @RenderSection("Footer", false)
       </div>
   }

и с точки зрения моего ребенка это было без условий

@section Footer{
        <div>
            @Html.AwButton("Reject", "Reject")
            @Html.AwSubmit("Ok", "Ok")
        </div>
    }

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

Джайдип Шил
источник
-1

проверьте орфографию и верхний / нижний регистр термина ""

когда мы пишем @RenderSection ("name", обязательно: false), убедитесь, что представление бритвы содержит раздел @section name {}, поэтому проверьте орфографию и верхний / нижний регистр термина "" Правильным в данном случае является "Скрипты"

Подфаз
источник
-1

Убедитесь, что вы ввели правильное написание при использовании раздела сценария в представлении

правильно

@section scripts{ //your script here}

если вы ввели @section script{ //your script here}это неправильно.

Петтер Фриберг
источник