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

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.

Что-то изменилось в этой области в новом выпуске? В примечаниях к выпуску я не видел ничего подходящего.

4b9b3361

Ответ 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>

Ответ 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=
  .....

Ответ 9

Чтобы развернуть ответ Matt DeKrey, просто удалить файл csproj.user(без необходимости повторного создания решений) удалось решить проблему для меня.

Единственный побочный эффект, который у меня был, - мне нужно было reset "Начать действие", чтобы использовать определенную страницу.

Ответ 10

В мире контрактов я часто использую машины, которые используют старые изображения. Пробовав все выше, я решил обновить VS 2013 до самой последней версии (Обновление 4). После 90 минут и перезагрузки ссылки работают отлично! Надеюсь, это поможет!

Ответ 11

В последнее время появилась та же проблема, и вот как я ее исправил: В Visual Studio с открытым проектом, Goto:

  • Инструменты → Диспетчер пакетов NuGet → Управление пакетами NuGet для решения.
  • В открывшемся окне выберите Обновления. затем нажмите Обновить все.

Он загрузит то, что отсутствует в вашем проекте, и все должно вернуться в нужное место.

Ответ 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>