Наступні розділи були визначені, але для сторінки макета "~ / Views / Shared / _Layout.cshtml" не були надані: "Сценарії"


100

Я новачок у ASP MVC та використовую бета-підручник Intro to ASP MVC 4 http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/intro-to-aspnet -mvc-4

У мене виникає помилка, на яку я, здається, не можу знайти відповіді, і не маю багато досвіду програмування, тому я не знаю, з чого навіть почати виправляти цей крок за допомогою підручника. Я вдячний за будь-яку допомогу, яку ви можете надати.

Я перебуваю у розділі Доступ до даних вашої моделі з розділу «Контролер», і я отримую цю помилку, коли я намагаюся створити фільм як частину підручника, натискаю на посилання «Створити нове», і я отримую таку помилку

Наступні розділи були визначені, але не надані для сторінки макета> "~ / Views / Shared / _Layout.cshtml": "Сценарії"

Замість того, щоб використовувати Visual Studio express, я вирішив завантажити Visual Studio 2012 RC (не впевнений, що це буде першопричиною моєї проблеми.

Я усвідомлюю, що ви можете вимагати від мене включити код, щоб відповісти на це, але я не впевнений, який код навіть включити. Будь ласка, порадьте, який код вам потрібно мені включити, якщо такий є, і я буду радий додати його до свого питання.

Дякую,


Ви повинні слідкувати за версією навчального посібника Visual Studio 2012 asp.net/mvc/tutorials/mvc-4/…
RickAndMSFT

1
У мене була така ж проблема, і моя проблема була вирішена, коли я вийняв RenderSection з @ {} і використовував тільки @. Не знаю, чому це трапляється
Гільерме Феррейра

1
Посилання в коментарі RickAnd вище для мене не працює. Але що ще важливіше, це не питання підручника, це проблема генерування коду VS, яку легко виправити, і її не слід просто обговорювати, видаляючи пробільну лінію, оскільки багато відповідей нижче прийнятих пропозицій. Дивіться мою відповідь ( stackoverflow.com/a/27152625/165164 ) нижче для обговорення того, що насправді відбувається - принаймні для деяких версій VS.
Енн Ганн

Заявлена ​​помилка створюється, коли представлення визначило a, @sectionяке НЕ відображається у макеті (з RenderSection). Це може статися, якщо ви вказали неправильну Layoutабо взагалі забули посилатися на макет. Дивіться відповідь @ vonv
StuartLC

Відповіді:


144

Це означає, що ви вказали розділ у своєму головному Layout.cshtml, але ви нічого не включили для цього розділу у свій Перегляд.

Якщо ваш _Layout.cshtml має щось подібне:

@RenderSection("scripts")

Тоді всі перегляди, які використовують цей макет, повинні містити@section тему з такою ж назвою (навіть якщо вміст розділу порожній):

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

Як альтернативу, ви можете встановити потрібне значення false, тоді вам не потрібно буде додавати розділ у кожен перегляд,

@RenderSection("scripts", required: false)

або також можна загортати @RenderSectionв ifблок,

@if (IsSectionDefined("scripts"))
{
    RenderSection("scripts");
}

7
Ваша відповідь була корисною. Я не ідентифікував жодного @RenderSection ("Сценарії") в _Layout.cshtml, але я помітив у видах, які були автоматично створені під час створення мого контролера фільмів для цього підручника, що у них були @section Scripts {@ Scripts.Render (" ~ / bundles / jqueryval ")} Отже, я видалив ті, на даний момент, і все зараз працює.
Кевін Темний

23
поки ваша відповідь хороша. Я думаю, вам слід зазначити, що додавання , required: false)його @RenderSection("scripts", required: false)дозволить включити його чи ні.
Еонасдан

3
@ KDark11 Під час створення представлення VS запитує, чи хочете ви посилатися на сценарії. Просто зніміть це.
Еонасдан

1
Я погоджуюся, що введення @RenderSection("scripts", required: false)в створений _Layout.cshtml є правильним рішенням. (Дивіться дискусію нижче для того, чому.) Таким чином ви можете додати виправлення в один файл, а не у все - багато виправлення DRYer.
Енн Ганн

@Eonasdan Ух, це приголомшливо! коли вони додали цю функцію? будь ласка, не кажіть мені v1.0: - /
Simon_Weaver


24

У мене був випадок з 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, а всередині Content Content я визначаю розділ. Це може бути?
Гільгерме Феррейра

Сьогодні я навчився робити "середній макет" завдяки зразку коду тут. @section Foo {@RenderSection("Foo")}щоб "передати" розділи! Також довелося перейти на тіло с @RenderBody().
starlocke

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"

Питання ОП подібне до випуску №2, і прийнята відповідь стосується питання №1.


3
Погоджено, коментар ОП: він видалив розділ, щоб усунути помилку, це означає, що у нього був розділ, визначений у поданні, але не в макеті, не навпаки, як більшість адрес відповідей (випуск №2, який відповідає помилка, яку вони описують) Усі інші відповіді описують ситуацію, яка не призведе до цієї помилки, але натомість "Розділ не визначений", а не "розділи були визначені, але ... не надані".
AaronLS

8

Я думаю, що наше рішення було досить відмінним від усіх інших, тому я його тут задокументую.

У нас є налаштування основного макета, макета посередника, а потім відображається сторінка остаточної дії. Main.cshtml <- Config.cshtml <- Action.cshtml

Тільки коли web.config у customErrors='On/RemoteOnly'нас з’явилась користувацька помилка, і вона не Application_Errorстала винятком і не була викликана. Я міг би Layout = nullвпізнати це на лінії в Error.cshtml. Виняток був, як у запитанні, пропущений сценарій розділу.

У нас це було визначено в Main.cshtml (з обов'язковим: false), а в Action.cshtml не було нічого, що було б записано в розділ сценаріїв.

Рішенням було додати @section scripts { @RenderSection("scripts", false) }до Config.cshtml.


7

Це відбувається в основному, коли _Layout.cshtml без:

@RenderSection("scripts", required: false)

або з

@RenderSection("scripts")  

БЕЗ

required: false

Отже, просто додайте @RenderSection ("скрипти", обов'язкові: false) у _Layout.cshtml, і це працює спеціально для тих розробників, які працюють з проектами, що генерують Kendoui.


7

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

Це правда , що ви можете зробити повідомлення про помилку зникне , тільки видалення

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

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

Але це рішення не стосується першопричини і не залишає вас в хорошому місці, щоб зробити більше, ніж закінчити прогулянку по підручнику. У якийсь момент (можливо, досить рано) у розробці реального додатка вам потрібно буде отримати доступ до коду перевірки jquery, який рішення коментування вилучає з вашої програми.

Якщо ви використовуєте VS для створення нової моделі для вас, вона також створює набір з п'яти файлів перегляду: Створити, Видалити, Деталі, Редагувати та Покажчик. Два з цих переглядів "Створити та редагувати" призначені для того, щоб користувач міг додавати / редагувати дані для полів у записах баз даних, що лежать в основі моделі. Для цих поглядів у реальному додатку, ймовірно, ви захочете зробити деяку кількість перевірки даних за допомогою бібліотеки перевірки jquery, перш ніж зберегти запис у db. Ось чому VS додає наступні рядки

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

внизу цих двох поглядів, а не інших. Автогенерований код намагається зробити бібліотеку перевірки доступною для цих представлень, але не для інших.

Помилка трапляється через те, що VS або не додає відповідного рядка до спільного файлу _Layout.cshtml, або, див. Одну відповідь вище, додає його, але залишає його прокоментованим. Ця лінія є

@RenderSection("scripts", required: false)

Якщо в деяких ваших переглядах є розділ сценаріїв (як створити та редагувати), у макет має бути команда RenderSection. Якщо в деяких сценаріях є розділ, а в деяких немає (як Видалити, Деталі та Індекс немає), команда RenderSection повинна мати required: falseпараметр.

Тож найкращим рішенням, якщо ви хочете зробити щось більше, ніж просто закінчити прогулянку по підручнику, - це додати вислів до _Layout.cshtml, а не видаляти код із перегляду «Правка та створення».

PS Тут трохи плутанина, що те, що потрібно, знаходиться у «пакеті», а оператор вимагає виглядати так, що він намагається включити файл у папку пакетів, яка не існує у вашому проекті. Але для налагодження і підручників це не актуально, оскільки пакетні файли включаються один за одним. Дивіться: http://www.asp.net/mvc/overview/performance/bundling-and-minification Код, про який йдеться, згадується коротко про дві третини шляху вниз по сторінці.


Це «скеля» і справді хороше пояснення. Можливо, він прийшов пізніше, тому не отримав багато голосів ....
JosephDoggie

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")

} **

Тому я видалив ці рядки і програма почала працювати безперебійно.



0

Я шукав помилку в Інтернеті і прийшов на цю сторінку. Я використовую Visual Studio 2015, і це мій перший проект MVC.

Якщо ви пропустите символ @ перед розділом візуалізації, ви отримаєте ту ж помилку. Я хотів би поділитися цим для майбутніх початківців.

 @RenderSection("headscripts", required: false)

0

У мене є відчуття, що ви рендеруєте свій розділ з @section у файлі _Layout, який посилається на частковий вигляд з @section, тобто ви вклали @section в межах @section. У файлі _Layout видаліть @section навколо візуалізації.



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 ("ім'я", обов'язкове: помилкове), переконайтесь, що вигляд бритви містить розділ @ назва розділу {}, тому перевірте правопис та верхній / нижній регістр терміна "" Правильним у цьому випадку є "Сценарії"


-1

Переконайтеся, що ви ввели правильний написання розділу перегляду сценарію

правильно

@section scripts{ //your script here}

якщо ви ввели @section script{ //your script here}це неправильно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.