Razor Views не видит System.Web.Mvc.HtmlHelper
Сейчас я обновляюсь до MVC4. Я выполнил инструкции http://www.asp.net/whitepapers/mvc4-release-notes#_Toc303253806, но в моих представлениях и макетах Razor у меня есть ошибки, например
- 'System.Web.WebPages.Html.HtmlHelper' не содержит определения
для "BeginRouteForm" и никакого метода расширения "BeginRouteForm"
Принимая первый аргумент типа
'System.Web.WebPages.Html.HtmlHelper' может быть найден (вы отсутствуете
директива using или ссылка на сборку?)
У меня также есть такие ошибки, как:
- "Имя" Сумка для просмотра "не существует в текущем контексте
Когда я наводил курсор на @Html, я вижу, что он имеет тип System.Web.WebPages.Html.HtmlHelper not System.Web.Mvc.HtmlHelper
Не совсем уверен, какая другая информация уместна, но я здесь:
- Я еще не обновил библиотеки классов и т.д. в sln до .net 4.5.
- Проект был создан в VS2010, но я выполняю миграцию в
VS2012
- Проект открывается и работает ОК с VS2012,.Net 4.0, MVC 3
Любые указатели оценили.
Edit:
Все ссылки и файлы в web.config обновлены до:
- System.Web.Mvc, Version = 4.0.0.0
- System.Web.WebPages, Version = 2.0.0.0
- System.Web.Helpers, Version = 2.0.0.0
- System.Web.WebPages.Razor,
Version = 2.0.0.0
Edit (2):
В моем /views/web.config(или/views/shared/web.config, если я попробую решение @Paul ниже) в элементе, у меня есть свой собственный базовый тип, который наследуется от System.Web.Mvc.WebViewPage, ссылки в содержащая библиотека была обновлена до MVC4, и переход к определению приведет меня к DLL MVC4.
Что-то изменилось в этой области в новом выпуске? В примечаниях к выпуску я не видел ничего подходящего.
Ответы
Ответ 1
Я столкнулся с этой проблемой с веб-приложением - мои файлы .cshtml
застряли в базовом классе System.Web.WebPages.WebViewPage
, когда мне понадобился System.Web.Mvc.WebViewPage
.
Во-первых, убедитесь, что ваш файл ~/Views/web.config имеет правильный pageBaseType
. В моем случае я установил System.Web.Mvc.WebViewPage
.
<configuration>
<system.web.webPages.razor>
<pages pageBaseType="System.Web.Mvc.WebViewPage">
<!-- ... -->
</pages>
</system.web.webPages.razor>
</configuration>
Затем важно, некоторые люди обнаружили, что это ключ, если выше это уже хорошо:
- Запустите очистку в решении
- Разгрузите проект с проблемами
- Удалите файл
.user
, созданный Visual Studio рядом с проектом.
- Перезапустите проект с проблемами
- Создайте решение
Для VS2015 файлы .user
и .sln
переместились в скрытую папку .vs
, созданную рядом с файлом .sln
. Однако из комментариев, приведенных ниже, сообщения об ошибках подразумевают, что инструментарий полностью использует неправильную версию MVC, и удаление этой папки не устраняет проблему. Насколько мне известно, не существует известного решения.
Ответ 2
У меня была такая же проблема при обновлении до MVC 5, и она была решена путем обновления web.config внутри папки "Представления".
<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" />
</namespaces>
</pages>
Хост → factoryType был установлен в версию: 4.0.0.0
надеюсь, что это кому-то поможет.
Ответ 3
Я попробовал все решения здесь, но никто из них не работал у меня. Опять же, мой сайт работает нормально, но у меня нет intellisense и красных волнистых линий во многих вещах в моих представлениях, которые Visual Studio не распознает, один из них Html.BeginForm()
, а также что-то связанное с ViewBag
.
Я работаю с новым проектом MVC 5. После нескольких часов сравнения строк web.config я наконец нашел, что исправил это для меня.
У моего web.config моего корня была следующая строка:
<system.web>
<compilation debug="true" targetFramework="4.5" />
<!-- ... -->
</system.web>
Я по сравнению с предыдущим проектом, не использующим MVC 5, и скопировал над блоком, который, как я заметил, отсутствовал в новом, который был следующим:
<system.web>
<compilation debug="true" targetFramework="4.5">
<assemblies>
<add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.Helpers, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.Mvc, Version=5.1.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.WebPages, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
</assemblies>
</compilation>
<!-- ... -->
</system.web>
Я скопировал вышеуказанный блок в свой новый проект web.config в корне, изменив версии в соответствии с числами для каждой сборки, найденной в моих ссылках на проекты (щелкнув правой кнопкой мыши каждую упомянутую ссылку и выбрав "Свойства", "Версия" дается в нижней части окна свойств для выбранной ссылки).
После реализации выше, теперь у меня есть intellisense и не получаю никаких неизвестных красных строк под такими вещами, как Html.BeginForm
, ViewBag.Title
и т.д.
Ответ 4
Я выполнил проект чистым и установил или переустановил все и все еще получал много ошибок Intellisense, хотя мой сайт компилировался и работал нормально. Intellisense, наконец, работал у меня, когда я изменил номера версий в файле web.config в папке "Представления". В моем случае я кодирую модуль в Orchard, который работает в области MVC, но я думаю, что это поможет любому, кто использует последнюю версию MVC. Вот мой web.config из папки "Представления"
<?xml version="1.0"?>
<configuration>
<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.1.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<pages pageBaseType="Orchard.Mvc.ViewEngines.Razor.WebViewPage">
<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.Linq" />
<add namespace="System.Collections.Generic" />
</namespaces>
</pages>
</system.web.webPages.razor>
<system.web>
<!--
Enabling request validation in view pages would cause validation to occur
after the input has already been processed by the controller. By default
MVC performs request validation before a controller processes the input.
To change this behavior apply the ValidateInputAttribute to a
controller or action.
-->
<pages
validateRequest="false"
pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=5.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"
pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=5.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"
userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=5.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<controls>
<add assembly="System.Web.Mvc, Version=5.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" namespace="System.Web.Mvc" tagPrefix="mvc" />
</controls>
</pages>
</system.web>
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<handlers>
<remove name="BlockViewHandler"/>
<add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
</handlers>
</system.webServer>
</configuration>
Ответ 5
Вам нужно скопировать Views/Web.config
в /Shared
. Это позволит Razor использовать базовый тип MVC и парсер. Вы можете прочитать больше здесь: http://blog.slaks.net/2011/02/dissecting-razor-part-3-razor-and-mvc.html
Ответ 6
Я имел дело с этой проблемой после обновления от Visual Studio 2013
до Visual Studio 2015
. Пробовав большую часть рекомендаций, найденных в этом и других подобных сообщениях SO, я, наконец, нашел проблему. Первая часть исправления заключалась в том, чтобы обновить все мои материалы NuGet
до последней версии (возможно, вам понадобится сделать это в VS13
, если вы столкнулись с ошибкой NuGet
), после чего мне пришлось, как вы можете необходимо исправить версии, перечисленные в Представления Web.config
. Это включает в себя:
- Исправить
MVC
версии и его дочерние библиотеки в новой версии (разверните References
, затем щелкните правой кнопкой мыши по Sytem.Web.MVC
, затем Properties
, чтобы получить вашу версию)
- Исправьте версию
Razor
.
Шахта выглядела так:
<configuration>
<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.2.3.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" />
</namespaces>
</pages>
</system.web.webPages.razor>
<appSettings>
<add key="webpages:Enabled" value="false" />
</appSettings>
<system.web>
<httpHandlers>
<add path="*" verb="*" type="System.Web.HttpNotFoundHandler"/>
</httpHandlers>
<pages
validateRequest="false"
pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<controls>
<add assembly="System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" namespace="System.Web.Mvc" tagPrefix="mvc" />
</controls>
</pages>
</system.web>
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<handlers>
<remove name="BlockViewHandler"/>
<add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
</handlers>
</system.webServer>
</configuration>
Ответ 7
Пробовав все напрасно, я обнаружил, что в моем случае он не работал из-за неправильного значения атрибута в файле web-проекта csproj. Когда я изменяю ToolsVersion на 14, что соответствует моей текущей версии IDE (т.е. Visual Studio 2015), все работает как шарм:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition=
.....
Ответ 8
Для тех из вас, кто страдал этим после перенастройки проекта с VS 2013 до VS 2015, я смог исправить эту проблему, установив обновление инструментов ASP.NET из https://visualstudiogallery.msdn.microsoft.com/c94a02e9-f2e9-4bad-a952-a63a967e3935/file/77371/6/AspNet5.ENU.RC1_Update1.exe?SRC=VSIDE&UPDATE=TRUE.
Ответ 9
Чтобы развернуть ответ Matt DeKrey, просто удалить файл csproj.user(без необходимости повторного создания решений) удалось решить проблему для меня.
Единственный побочный эффект, который у меня был, - мне нужно было reset "Начать действие", чтобы использовать определенную страницу.
Ответ 10
В мире контрактов я часто использую машины, которые используют старые изображения. Пробовав все выше, я решил обновить VS 2013 до самой последней версии (Обновление 4). После 90 минут и перезагрузки ссылки работают отлично! Надеюсь, это поможет!
Ответ 11
В последнее время появилась та же проблема, и вот как я ее исправил:
В Visual Studio с открытым проектом, Goto:
- Инструменты → Диспетчер пакетов NuGet → Управление пакетами NuGet для решения.
- В открывшемся окне выберите Обновления. затем нажмите Обновить все.
Он загрузит то, что отсутствует в вашем проекте, и все должно вернуться в нужное место.
Ответ 12
Просто начал изучать проблему сам, и это то, на что это похоже в моем случае. Если у вас есть правильные значения в вашей веб-конфигурации, то это просто ошибка в MVC4.
http://connect.microsoft.com/VisualStudio/feedback/details/727729/viewbag-not-recognized-in-asp-net-mvc-4-project
Ответ 13
*<system.web>
<compilation debug="true" targetFramework="4.5">
<assemblies>
<add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.Helpers, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.Mvc, Version=5.1.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.WebPages, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
</assemblies>
</compilation>*
Эта конфигурация отсутствует, добавьте ее и установите соответствующую версию сборок
Ответ 14
Как вариант на тему, я мог бы поклясться, что мои представления \Web.config верны:
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
Но мне действительно нужно было ссылаться на Version=4.0.0.1
, а не Version=4.0.0.0
из-за этого обновления для системы безопасности, которое было отброшено некоторое время назад.
Ответ 15
Что касается меня, это была глупая ошибка развертывания: веб-проекты могут иметь более одного web.config. Он работал на машине-разработчике, а не на производстве, но мы не понимали, что развертывание script только захватило файл Web.config
в корневом каталоге и не скопировал файл Web.config
в Views
папку.
Ответ 16
Я столкнулся с этой конкретной проблемой; no (или неправильный) intellisense, показывающий при попытке использовать теги бритвы. Моя особая проблема заключалась в том, что VS2015 жаловался, что Html.BeginForm не существует в текущем контексте.
У меня есть области, созданные в моем проекте MVC, и удалось сузить причину моей ошибки в файле web.config для определенной области, а не для глобального web.config.
Оказывается, причиной этой проблемы для меня было то, что я добавил SQL connectionString в web.config для области, которая не работала, это (я предполагаю) вызвало ошибку синтаксического анализа, однако проект правильно составлен.
Перемещение connectionString в глобальный web.config устранило проблему. Надеюсь, это может быть полезно для других.
Ответ 17
Моя ситуация произошла только после того, как я создал пользовательский класс с именем BaseViewPage
, который переопределяет класс WebViewPage
. Я сначала добавил следующее в мой Основной файл Web.confg:
<pages pageBaseType="ZooResourceLibrary.Web.Support.BaseViewPage">
И то же самое с папками Вид: файл web.config:
<pages pageBaseType="ZooResourceLibrary.Web.Support.BaseViewPage">
Я пробовал многие другие ответы, и никто не делал этого, все еще позволяя мне сохранять класс BaseViewPage
. Я исправил это, чтобы удалить атрибут pageBaseType
только из файла Основной Web.config. Сохраните его в View web.config.
Ответ 18
Я встретил несколько ответов в SO, и в конце я понял, что моя ошибка в том, что у меня был с ошибкой "Html.TextBoxFor". В моем случае я написал "Html.TextboxFor". Я не заглавил B в TextBoxFor. Исправлено это и вуаля. Задача решена. Надеюсь, это поможет кому-то.
Ответ 19
Я использовал следующую статью в MSDN для решения этой проблемы (в данном случае от MVC 4 до MVC 5)
https://docs.microsoft.com/en-us/aspnet/mvc/overview/releases/how-to-upgrade-an-aspnet-mvc-4-and-web-api-project-to-aspnet-mvc-5-and-web-api-2
Основные выдержки из статьи:
Основной файл Web.config(не тот, который находится в папке Views)
В обновленном блоке обновления System.Web.Mvc до 5.0.0.0, System.Web.Helpers до 3.0.0.0 и System.Web.WebPages до 3.0.0.0
<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.WebPages" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
</dependentAssembly>
Затем найдите блок appsettings и обновите веб-страницы: значение версии до 3.0.0.0
<appSettings>
<add key="webpages:Version" value="3.0.0.0" />
</appSettings>
Представления Web.config
Обновите блок factoryType хоста для System.Web.Mvc до 5.0.0.0
<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" />
</namespaces>
</pages>
</system.web.webPages.razor>
Затем под блочным блоком обновите любые ссылки на System.Web.Mvc до 5.0.0.0
<pages
validateRequest="false"
pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<controls>
<add assembly="System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" namespace="System.Web.Mvc" tagPrefix="mvc" />
</controls>
</pages>
И, наконец, при обновлении блока конфигурации ссылки System.Web на 3.0.0.0
<configuration>
<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>
Ответ 20
Правильно, я пытался исправить эту проблему на некоторое время. Я использовал все решения в различных вопросах по этому вопросу, и ни один из них не работал.
Я только что решил проблему сегодня утром. После того, как вы установили файл web.config для проекта и представлений, убедитесь, что все версии .dll соответствуют тому, что у вас есть в папке с ссылками. Вам нужно будет выгрузить проект, отредактировать файл .csproj, а затем обновить все версии .dll в этом файле.
System.Web.Helpers
System.Web.Mvc
System.Web.WebPages
Надеюсь, это поможет, поскольку я, наконец, исправил эту проблему! Нет более красных squiggly линий.
Это также устранило проблему контекстного меню, с которой я столкнулся, я не получал возможность добавить контроллер, просмотр и т.д.
Ответ 21
Для меня решение заключалось в том, чтобы изменить следующее:
<pages
validateRequest="false"
pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<controls>
<add assembly="System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" namespace="System.Web.Mvc" tagPrefix="mvc" />
</controls>
</pages>