it-swarm.com.ru

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 или ссылку на сборку?)

У меня также есть ошибки, такие как:

  • "Имя 'Viewbag' не существует в текущем контексте

При наведении курсора на @Html я вижу, что он имеет тип System.Web.WebPages.Html.HtmlHelper, а не System.Web.Mvc.HtmlHelper.

Не совсем уверен, какая другая информация уместна, но вот где я:

  • Я еще не обновил библиотеки классов и т.д. В sln до .net 4.5.
  • Проект был создан в VS2010, но я делаю миграцию в VS2012 
  • Проект открывается и работает нормально с VS2012, .Net 4.0, MVC 3

Любые указатели приветствуются.

Edit: Все ссылки и файлы в web.config обновлены до:

  • System.Web.Mvc, версия = 4.0.0.0 
  • System.Web.WebPages, версия = 2.0.0.0
  • System.Web.Helpers, версия = 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, и переход к определению приводит меня к MVC4 dll.

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

66
NikolaiDante

Я столкнулся с этой проблемой в веб-приложении - мои файлы .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>

Затем, важно, некоторые люди нашли, что это ключ, если вышеупомянутое уже хорошо:

  1. Запусти решение
  2. Разгрузить проект с проблемами
  3. Удалите файл .user, созданный Visual Studio рядом с проектом. 
  4. Перезагрузите проект с проблемами
  5. Постройте решение

Для VS2015 файлы .user и .sln перемещены в скрытую папку .vs, которая создается рядом с файлом .sln. Тем не менее, из комментариев ниже, сообщения об ошибках намекают на то, что инструмент полностью использует неправильную версию MVC, и удаление этой папки не решает проблему. Насколько мне известно, не существует известного решения.

87
Matt DeKrey

У меня была такая же проблема при обновлении до MVC 5, и она была решена путем обновления web.config в папке Views.

<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 Надеюсь, это кому-нибудь поможет.

24
user3141889

Я попробовал все решения здесь, но ни одно из них не помогло мне. Опять же, мой сайт работает нормально, но у меня нет 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 и т.д.

8
David Gunderson

Я запустил проект без ошибок, установил или переустановил все, и все равно получал много ошибок Intellisense, хотя мой сайт компилировался и работал нормально. Intellisense, наконец, сработало для меня, когда я изменил номера версий в моем файле web.config в папке Views. В моем случае я пишу модуль в Orchard, который работает в области MVC, но я думаю, что это поможет любому, кто использует последнюю версию MVC. Вот мой web.config из папки Views

    <?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
user2570487

Вам нужно скопировать Views/Web.config в /Shared. Это скажет Razor использовать базовый тип MVC & парсер. Вы можете прочитать больше здесь: http://blog.slaks.net/2011/02/dissecting-razor-part-3-razor-and-mvc.html

4
Paul

Я имел дело с этой проблемой после обновления с Visual Studio 2013 до Visual Studio 2015 После того, как попробовал большинство советов, найденных в этом и других подобных SO сообщениях, я наконец нашел проблему. Первая часть исправления состояла в том, чтобы обновить все мои материалы NuGet до последней версии (вам может потребоваться сделать это в VS13, если вы испытываете ошибку Nuget) после того, как мне пришлось, как вам может понадобиться, исправить версии перечислены в Просмотров Web.config. Это включает: 

  1. Исправьте версии MVC и его дочерние библиотеки в новой версии (разверните References, затем щелкните правой кнопкой мыши на Sytem.Web.MVC, затем Properties, чтобы получить свою версию) 
  2. Исправьте версию 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>
3
Serj Sagan

Попробовав все напрасно, я обнаружил, что в моем случае это не сработало из-за неправильного значения атрибута в файле 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=
  .....
2
Korayem

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

2
RichieMN

Для тех, кто страдает от этого после переноса проекта с 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 .

2
chipples

Обновление для пользователей Visual Studio 2017:

Если вы только что перешли на Visual Studio 2017 и ваш проект MVC4, вернитесь к установщику VS2017 и выберите параметр MVC4 в разделе «ASP.NET и веб-разработка». Это необязательный компонент и по умолчанию не отмечен. 

Это решило мою проблему

2
Mike Smith

Просто чтобы расширить ответ Мэтта ДеКрея, просто удаление файла csproj.user (без необходимости пересоздания решений) смогло решить проблему для меня.

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

1
harvyk

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

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

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

1
Donald Mkhomole

Я использовал следующую статью на 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-и-веб-API-2

Основные выдержки из статьи: 

Main 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

Обновите блок Host 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>
1
Jflip

Просто сам начал разбираться в проблеме, и вот как она выглядит в моем случае. Если у вас есть правильные значения в вашей веб-конфигурации, то это просто ошибка в MVC4 . http://connect.Microsoft.com/VisualStudio/feedback/details/727729/viewbag-not-recognized-in-asp -net-mvc-4-project

0
QueueHammer
*<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>*

Эта конфигурация отсутствует, добавьте ее и установите соответствующую версию сборок

0
ALZ

Моя ситуация возникла только после того, как я создал пользовательский класс с именем BaseViewPage, который переопределил класс WebViewPage. Первоначально я добавил следующее в мой файл Main Web.confg:

<pages pageBaseType="ZooResourceLibrary.Web.Support.BaseViewPage">

И то же самое для файла View folder web.config:

<pages pageBaseType="ZooResourceLibrary.Web.Support.BaseViewPage">

Я попробовал многие другие ответы, но ни один из них не помог, но я все же оставил свой класс BaseViewPage. Я исправил это, удалив атрибут pageBaseType только из файла Main Web.config. Держите его в View web.config.

0
Grandizer

Я также столкнулся с этой конкретной проблемой; нет (или неправильно) intellisense отображается при попытке использовать бритвенные теги. Моя конкретная проблема была VS2015, жалуясь, что Html.BeginForm не существовал в текущем контексте.

В моем проекте MVC настроены области, и мне удалось сузить причину моей ошибки в файле web.config для конкретной области, а не в глобальном файле web.config.

Оказалось, что причиной этой проблемы для меня было то, что я добавил SQL connectionString в web.config для области, которая не работала, это (я предполагаю) вызвало ошибку синтаксического анализа, однако проект скомпилирован правильно ,.

Перемещение connectionString в глобальный web.config устранило проблему. Надеюсь, это может быть полезным для других.

0
0xFF

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

Я только что исправил проблему этим утром. После того, как вы исправили файл web.config как для проекта, так и для представлений, убедитесь, что все версии DLL совпадают с тем, что есть в папке с ссылками. Вам нужно будет выгрузить проект, отредактировать .csproj, а затем обновить все версии .dll в этом файле.

System.Web.Helpers
System.Web.Mvc
System.Web.WebPages

Надеюсь, это поможет, так как я наконец исправил эту проблему! Нет больше красных волнистых линий.

Это также исправило проблему контекстного меню, в которой у меня не было возможности добавить контроллер, просмотреть и т.д.

0
Pavan Dhariwal

На мой взгляд, это была глупая ошибка развертывания: веб-проекты могут иметь более одного web.config. Он работал на компьютере разработчика, а не на производстве, но мы не понимали, что сценарий развертывания захватил только файл Web.config в корне и не скопировал файл Web.config в папку Views.

0
knocte

Как вариант темы, я мог поклясться, что мой Views\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 из-за того обновления безопасности, которое было выпущено некоторое время назад.

0
Nicholas Piasecki

Я наткнулся на несколько ответов в SO, и в конце я понял, что моей ошибкой было то, что я неправильно написал «Html.TextBoxFor». В моем случае я написал «Html.TextboxFor». Я не прописывал B в TextBoxFor. Исправлено это и вуаля. Задача решена. Я надеюсь, что это помогает кому-то.

0
Amadeus Sánchez