MVC 4 @Scripts «не существует»


201

Я только что создал проект ASP.NET MVC 4 и использовал Visual Studio 2012 RC для создания представлений контроллера и Razor для Indexи Createдействий.

Когда я пришел, чтобы запустить приложение и перешел к Createпредставлению, была показана следующая ошибка:

Сообщение об ошибке компилятора: CS0103: имя «Сценарии» не существует в текущем контексте

Проблема заключается в следующем коде, который был автоматически добавлен в конец представления:

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

Почему сценариев не существует?

Я посмотрел на базовый класс веб-страниц в сборке System.Web.Mvc.dll, v4.0.0.0

Я вижу следующие доступные свойства помощника:

  • Ajax
  • Html
  • Веб-сайт

Но ничто по имени Скрипты.

Любые идеи?

РЕДАКТИРОВАТЬ:

Мой файл Web.config выглядит следующим образом (не тронутый тем, который создал Visual Studio):

  <system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>

РЕДАКТИРОВАТЬ № 2:

Люди пишут в блоге об использовании @Scriptsпомощника:

Тем не менее, после установки Visual Studio 2012 RC на новую установку Windows 8 я все еще не могу использовать его, @Scriptsхотя Visual Studio добавляет его в сгенерированный View!

Решения представлены ниже.

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


уже попробовали добавить в Web.config? <system.web.webPages.razor> <pages pageBaseType=""> <add namespace="System.Web.Mvc" /> <add namespace="System.Web.Mvc.Ajax" /> <add namespace="System.Web.Mvc.Html" /> etc... </pages>
Зак Дев

Я добавил раздел из Web.config, но я ничего не изменил в этом файле.
FantasticJamieBurns

6
Вы имеете в виду файл «Мои представления \ Web.config», а не корневой каталог приложения web.config. В любом случае, это неверно и отсутствует <add namespace = "System.Web.Optimization" />. Вы установили VS12 Beta до RC? Какая версия win8?
RickAndMSFT

@RickAndMSFT Я выполнил чистую установку Win8 из Release Preview ISO вместе с установкой из VS 2012 RC ISO, чтобы убедиться, что это не конфликт версий.
FantasticJamieBurns

@RickAndMSFT My Views \ Web.config будет пропускать любые просмотры в областях
Маслоу

Ответы:


269

Ключ здесь, чтобы добавить

 <add namespace="System.Web.Optimization" /> 

ОБА файлы web.config. Мой сценарий состоял в том, что у меня была ссылка System.Web.Optimization как в проекте, так и в main / root web.config, но @Scripts все еще не работал должным образом. Вам нужно добавить ссылку на пространство имен в файл Views web.config, чтобы он работал.

ОБНОВИТЬ:

С момента выхода MVC 4 System.Web.Optimization устарела. Если вы начинаете с пустого решения, вам нужно установить следующий пакет nuget:

Install-Package Microsoft.AspNet.Web.Optimization

Вам все еще нужно будет ссылаться на System.Web.Optimization в файлах web.config. Для получения дополнительной информации см эту тему:

Как добавить ссылку на приложение System.Web.Optimization для приложения MVC-3, преобразованного в 4

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


8
Вам также может потребоваться запустить Install-Package Microsoft.AspNet.Web.Optimizationиз пустого шаблона ASP.NET MVC4, так как он не включен по умолчанию.
Портман

@Portman Да, действительно, если вы начали с пустого шаблона проекта MVC, вам нужно установить пакет Microsoft.AspNet.Web.Optimization.
Марко

2
Это нужно только добавить в web.config в папке Views для меня.
user1534664

9
Это действительно решение. Тем не менее, мне нужно было перезапустить Visual Studio, чтобы это было распознано.
Джейсон Идс

4
Мне пришлось добавить это в мой Views / Web.config, а затем перезапустить Visual Studio.
Caverman

48

@Stylesи @Scripts2 новых помощника предоставлены System.Web.Optimizationбиблиотекой. Как следует из названия, они связывают и минимизируют файлы и ресурсы CSS и JavaScript соответственно.

Попробуйте включить пространство имен System.Web.Optimizationлибо по @usingдирективе, либо черезweb.config

http://ofps.oreilly.com/titles/9781449320317/ch_ClientOptimization.html#BundlingAndMinification

ОБНОВИТЬ

Microsoft переместила пакетирование / минификацию в отдельный пакет под названием Microsoft.AspNet.Web.Optimization. Вы можете скачать сборку с nuget .

Этот пост будет вам полезен.


2
Добавление System.Web.Optimization говорит: «CS0234: имя типа или пространства имен« Оптимизация »не существует в пространстве имен« System.Web ». Нет ссылки под названием System.Web.Optimization для добавления.
FantasticJamieBurns

1
Пространство имен System.Web.Optimization устарело после получения ответа, попробуйте вместо этого использовать Microsoft.AspNet.Web.Optimization. См. Этот вопрос для получения дополнительной информации: stackoverflow.com/questions/9475893/…
Джереми Джаррелл

3
Пояснение: System.Web.Optimizationпространство имен НЕ устарело, оно System.Web.Optimization.dllесть.
Despertar

Спасибо! Это работает для меня, когда у меня возникли проблемы с макетом другой области.
Разработчик

48

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

<add namespace="System.Web.Optimization" />

в ~/Views/web.configпространствах имен закройте и снова откройте Visual Studio. Это то, что я должен был сделать, чтобы это работало.


2
То же самое здесь, перезапуск VS работал, но до этого он все еще показал ошибку ...?
Андреас

Закрытие VS не было необходимости в моем случае, но я должен был закрыть и заново открыть представление .cshtml, которое я использовал
joalcego

29

Я использую области, и только что столкнулся с этой проблемой, я просто скопировал пространства имен из корневого web.config в сеть областей. конфиг и теперь работает !!

    <add namespace="System.Web.Helpers" />
    <add namespace="System.Web.Mvc" />
    <add namespace="System.Web.Mvc.Ajax" />
    <add namespace="System.Web.Mvc.Html" />
    <add namespace="System.Web.Optimization" />        
    <add namespace="System.Web.Routing" />
    <add namespace="System.Web.WebPages" />

15

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

Резюме:

  • Добавить <add namespace="System.Web.Optimization"/>в оба файла web.config
  • Бегать Install-Package -IncludePrerelease Microsoft.AspNet.Web.Optimization
  • Обновление связующего кода
  • Обновить файл макета
  • Последний шаг - обновить 10 других библиотек. Я не сделал, и это работало нормально. Похоже, вы можете отложить этот (если я уже не обновил 1 или более из них). :)

Спасибо за ответ на этот Дэн! (И указывая на мой блог). Его вопрос подразумевал, что он начал с RC, но я думаю, что вы правы. Он просто добавил контроллер с RC в бета-проект.
RickAndMSFT

Это было пару недель, и вы оба наверняка заставили меня задуматься. Я, конечно, положил VS 2012 на свой планшет, на котором никогда не было ничего, кроме Metro Apps, и увидел, что он вышел из строя. Я попробую еще раз в ВМ.
FantasticJamieBurns

Это сработало для меня. Прочитайте связанную статью для точных инструкций о том, что вам нужно сделать.
Джастин

11

У меня была такая же проблема:

Используемая мной версия System.Web.Optimization устарела для MVC4 RC.

Я обновил свои пакеты с помощью менеджера пакетов в VS 2010.

В этом блоге MSDN г-н Энди рассказывает, как обновить ваш бета-проект MVC 4 до MVC 4 RC. Обновление моих пакетов заставило Сценарии (особенно веб-оптимизацию) решить для меня:

Чтобы установить последний пакет System.Web.Optimization, используйте Консоль диспетчера пакетов (Инструменты -> Диспетчер пакетов библиотеки -> Консоль диспетчера пакетов) и выполните следующую команду:

Install-Package -IncludePrerelease Microsoft.AspNet.Web.Optimization

Используйте файл System.Web.Optimization, включенный в пакет в ваших ссылках.

Чтобы обновить другие пакеты: Меню Сервис -> Диспетчер пакетов библиотеки -> Управление пакетами NuGet для решения.


5

Создайте новое интернет-приложение MVC 4 RC и запустите его. Перейдите к логину, который использует тот же код

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

Что позволяет Login.cshtml работать, так это файл Views \ Web.config (не корневая версия приложения), который содержит

<namespaces>

    <add namespace="System.Web.Optimization"/>

  </namespaces>

Почему ваш вид Create не работает, а Login -?


Я не использовал Логин - возможно, он был сломан в то время.
FantasticJamieBurns

5

Импортируйте System.Web.Optimization поверх вашего бритвенного представления следующим образом:

@using System.Web.Optimization

3

Я столкнулся с этой проблемой, однако во время выполнения команды:

Install-Package -IncludePrerelease Microsoft.AspNet.Web.Optimization 

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

Install-Package: указанный криптографический алгоритм не поддерживается на этой платформе.

Я запускаю это на Windows XP SP3 (не по выбору) и обнаружил, что должен был следовать инструкциям, опубликованным пользователем artsnob на форуме ASP.NET

  • Пожалуйста, удалите Nuget и попробуйте переустановить его. Если вы не можете сделать это, войдите в систему как администратор.
  • Перейдите в Инструменты => Диспетчер расширений => Выберите «Диспетчер пакетов Nuget» => Удалить
  • Установите его снова, выполнив поиск "Nuget" => Установить.
  • Если это не помогло, попробуйте установить версию 1.7.x, как я уже упоминал в предыдущем посте (это не значит, что вам нужно использовать предыдущую версию, если она работает нормально, мы можем сообщить об этой ошибке и получить патчи для последней версии).

После этого я мог запустить командную строку для обновления Web.Optimization.

Надеюсь, это спасет кого-то от копания.


2

Просто пиши

@section Scripts{
    <script src="@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl("~/bundles/jqueryval")"></script>
}

@archil Спасибо за замену - это будет хорошим временным решением. Но главный вопрос был: «Почему сценариев не существует?»
FantasticJamieBurns

@ Джейми, должно ли оно существовать? Я имею в виду, насколько я помню, там нет помощника Скиптов. Может быть, вы пытаетесь использовать какой-то сторонний помощник?
Archil

1
Я сам не добавил этот код - Visual Studio 2012 RC добавил его, когда создавал представление для моего действия «Создать». Я думаю, что как-то мой MVC 4 не подходит. Это должно где-то работать, потому что Скотт Хансельман упоминает о сбойном синтаксисе как о новом дополнении к MVC 4 RC: hanselman.com/blog/…
FantasticJamieBurns

1

Я обновился с бета-версии до RC и столкнулся с проблемой «Сценарии» не существует. Посижу в интернете, и окончательное решение - это то, что сказал N40JPJ, плюс еще одно решение:

Скопируйте следующее в View \ Web.config:

  <namespaces>
    <add namespace="System.Web.Mvc" />
    <add namespace="System.Web.Mvc.Ajax" />
    <add namespace="System.Web.Mvc.Html" />
    <add namespace="System.Web.Routing" />
    <add namespace="System.Web.Optimization"/>
    <add namespace="System.Web.Helpers"/>
  </namespaces>

и следующее внутри View \ Shared_Layout.cshtml

@if (IsSectionDefined("scripts")) 
{
       @RenderSection("scripts", required: false)
}

Надеюсь, поможет.


1
Нет необходимости использовать, if (IsSectionDefined())если вы не предоставите elseпункт. Тот факт, что вы говорите, required: falseуже позволяет этот раздел не быть определенным, и в этом случае этот раздел будет опущен. Так что это ненужный дополнительный код.
ErikE

0

Видимо, вы создали «пустой» тип проекта без папки «Scripts». Мой совет - создайте тип проекта «Basic» с полной папкой «Scripts».

С уважением ко всем разработчикам.


0

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

 @section Scripts {  

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

0
  1. : удалить просмотр страницы.
  2. : добавить пространство имен webconfig (в директории просмотра)
  3. : создать вид попробовать!

удачи...


0

Еще один пот - потратили целую вечность, пытаясь решить ту же проблему - даже если она была определена в web.config для root и root для Views. Оказывается, я ошибочно добавил его в элемент <system.web><pages><namespaces>, а не <system.web**.webPages.razor**><pages><namespaces>элемент.

Действительно легко пропустить это!


0

Когда я вхожу на страницу, которая имеет этот код:

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

Эта ошибка возникает: Ошибка. Произошла ошибка при обработке вашего запроса.

И это исключение записано в моих журналах:

System.Web.HttpException (0x80004005): The controller for path '/bundles/jqueryval' was not found or does not implement IController.
   em System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType)
...

Я перепробовал все советы на этой странице, и ни один из них для меня не решен. Поэтому я посмотрел на свою папку «Пакеты» и заметил, что у меня есть две версии для System.Web.Optmization.dll:

  • Microsoft.AspNet.Web.Optimization.1.1.0 (v1.1.30515.0 - 68,7 КБ)
  • Microsoft.Web.Optimization.1.0.0-beta (v1.0.0.0 - 304KB)

Мой проект ссылался на старую бета-версию. Я только изменил ссылку на более новую версию (69 КБ), и все работало нормально.

Я думаю, что это может кому-то помочь.


0

Это имеет очевидное решение. У меня была такая же проблема позже. Не относится к ссылкам на сборки или .... Это происходит при иерархическом вызове частичных представлений MVC, когда у вас сложные структуры страниц. Таким образом, вызов / рендеринг каждой части отдельно на каждой странице (может быть, главной или частичной) приведет к тому, что не будут отображаться необходимые части страницы, такие как приведенный ниже код:

@RenderSection("Scripts", required: false)

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

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

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


0

У меня была эта проблема после того, как я добавил Area в проект, в котором его не было. Чтобы избавиться от него, просто скопируйте файл web.config с корневой папкой Views в папку Views и он начал работать.


0

Я решаю эту проблему в MvcMusicStore, добавив эту часть кода в _Layout.cshtml

@if (IsSectionDefined("scripts")) 
{
       @RenderSection("scripts", required: false)
}

и удалите этот код из Edit.cshtml

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

Запустите программу, иншалла будет работать с вами.


0

Для меня это решило проблему, в консоли диспетчера пакетов NuGet напишите следующее:

update-package microsoft.aspnet.mvc -reinstall

0

Когда я недавно начал использовать MVC4, я столкнулся с вышеуказанной проблемой при создании проекта с пустыми шаблонами. Шаги, чтобы решить проблему.

  1. Перейдите TOOLS-> Library Package Manager-> Packager Manager Console Вставьте приведенную ниже команду и нажмите Enter. Install-Package Microsoft.AspNet.Web.Optimization Примечание: дождитесь успешной установки.
  2. Перейдите к файлу Web.Config в корневом уровне и добавьте ниже пространство имен в разделе пространства имен страниц. Добавить<namespace="System.Web.Optimization" />
  3. Перейдите к Web.Config в папке Views и выполните шаг 2.
  4. Постройте решение и запустите.

Пакет, упомянутый в шаге 1, добавит несколько системных библиотек в ссылки на решения, такие как System.Web. Оптимизация не является ссылкой по умолчанию для пустых шаблонов в MVC4.

Надеюсь, это поможет. Спасибо


0

У меня была очень похожая ошибка при обновлении проекта с MVC3 до MVC4.

Сообщение об ошибке компилятора: CS0103: имя [blah] не существует в текущем контексте

В моем случае у меня были устаревшие номера версий в нескольких моих Web.Configs.

  1. Мне нужно было обновить номер версии System.Web.Mvc с «3.0.0.0» до «4.0.0.0» в каждом файле Web.Config в моем проекте.
  2. Мне нужно было обновить все номера версий System.Web.WebPages, System.Web.Helpers и System.Web.Razor с «1.0.0.0» до «2.0.0.0» в каждом Web.Config в моем проекте.

Пример:

<configSections>
  <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
    <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
    <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
  </sectionGroup>
</configSections>

...

<compilation debug="true" targetFramework="4.0">
  <assemblies>
    <add assembly="System.Web.Helpers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <add assembly="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <add assembly="System.Web.WebPages, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
  </assemblies>
</compilation>

Обязательно просмотрите Web.Configs в каждом из ваших каталогов Views.

Вы можете прочитать больше об обновлении проекта ASP.NET MVC 3 до ASP.NET MVC 4 .


0

Если вы добавили файл web.config, и он по-прежнему показывает сообщение, то вам нужно закрыть проект и снова открыть его, теперь он будет существовать, и @ Styles.Render ("") и @ Scripts.Render () будут работать нормально.


-1

Попробуй это:

@section Scripts 
{
    Scripts.Render("~/bundles/jqueryval")  // <- without ampersand at the begin
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.