Подтвердить что ты не робот

Visual Studio MVC 5 показывает ошибки, но компилирует и работает нормально

Я получаю довольно странную ошибку, которая, похоже, началась, когда я обновил несколько пакетов NUGET (в том числе до MVC 5). В моем файле "_Layout.cshtml" теперь я получаю сообщения об ошибках, которые вы можете видеть на этом изображении (извините, я слишком новичок, чтобы публиковать его прямо здесь еще).

See here for error

Они перечислены как ошибки, а не предупреждения. Но моя сборка преуспевает, и проект работает, и, насколько я могу судить, все работает нормально. Я вижу эти ошибки только при открытии файла "_Layout.cshtml". Он действует так, как будто он не видит "System.Web.Optimization". Однако, если я наводил курсор на строку, мне будет предложено вставить этот текст и заставить его сказать:

@System.Web.Optimization.Styles.Render("~/Content/kendo/css")

вместо:

@Styles.Render("~/Content/kendo/css")

Но мне никогда не приходилось явно описывать это раньше, и если я начну новый проект, это не потребует от меня этого. Очевидно, что некоторые из моих обновлений вызвали это странное поведение (я предполагаю, что это связано с настройкой конфигурации где-то, но я не могу понять, что и где). Я проверил оба файла конфигурации ( "проект" один и "виды" ), и я уверен, что проблема должна быть там, но это выходит за рамки моей способности видеть проблему. Если бы это был нормальный файл класса, было бы очевидно, что я отсутствовал в инструкции "using" вверху, но это, похоже, не применимо здесь.

Может ли кто-нибудь указать мне на решение, кроме явно указывая на полную ссылку в коде, как указано выше? Это просто не похоже, что это необходимо, и мне кажется, что я буду обходить проблему, сделав это.

4b9b3361

Ответ 1

Наиболее вероятной причиной этой проблемы является то, что файл web.config в папках (-ях) просмотра/не работает. Для обновления ASP.NET MVC 5 требуется довольно много изменений конфигурации, что я не уверен, что менеджер пакетов NuGet делает (или хорошо, я думаю, что это позаботится о некоторых из них). Наряду с MVC 5.dll многие другие связанные сборки также необходимо обновить, а соответствующие ссылки также обновлены.

Взгляните на следующий учебник и убедитесь, что вы выполнили КАЖДОЕ необходимых шагов. Затем выполните очистку, перестройте и посмотрите, разрешены ли ваши проблемы.

Я обнаружил, что иногда лучше создавать VS новый проект MVC, а затем просматривать и сравнивать web.configs(как корневое приложение, так и папку views web.config), которые он генерирует для вашей конфигурации проекта чтобы убедиться, что вы не включаете пространства имен, которые не принадлежат, и все номера версий верны.

Ответ 2

Похоже, редактор VS *.cshtml ошибочно отмечает ошибку (хотя компилятор может разрешить ссылку).

Чтобы избавиться от него, просто включите пространство имен System.Web.Optimization в верхней части вашего _Layout.cshtml следующим образом: @using System.Web.Optimization. Это должно сделать трюк.

HTH Thomas

Ответ 3

Я обновил проект MVC3 до MVC5, создав базовый проект MVC5 и скопировав ключевые части BOTH Web.Configs. (в дополнение к обновлению пакетов Nuget, как вы это сделали.)

Из Web.Config в корне проекта:

  <appSettings>
    <add key="webpages:Version" value="3.0.0.0" />
    <add key="webpages:Enabled" value="false" />
  </appSettings>

  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" />
  </system.web>

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Optimization" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="1.1.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>

Из Web.Config в Views/:

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

  <system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.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.Optimization"/>
        <add namespace="System.Web.Routing" />
        <add namespace="MVC5" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>

  <appSettings>
    <add key="webpages:Enabled" value="false" />
  </appSettings>

  <system.webServer>
    <handlers>
      <remove name="BlockViewHandler"/>
      <add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
    </handlers>
  </system.webServer>

Следует отметить, что конечное пространство имен добавлено в system.web.webPages.razor - это имя проекта - в этом случае мой пустой проект был просто прост, "MVC5". Вы захотите изменить это имя в соответствии с вашим проектом.

Ответ 4

В сочетании с ответами выше, что решило проблему для меня в Visual Studio 2015, было просто добавлено:

<add namespace="System.Web.Optimization"/> in Web.Config in Views/:

Ответ 5

Все они уже были установлены в Visual Studio 2017 - единственный способ заставить это работать с помощью Visual Basic включать это в представление:

@imports Microsoft.VisualBasic