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" вверху, но это, похоже, не применимо здесь.
Может ли кто-нибудь указать мне на решение, кроме явно указывая на полную ссылку в коде, как указано выше? Это просто не похоже, что это необходимо, и мне кажется, что я буду обходить проблему, сделав это.
Ответы
Ответ 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