web-dev-qa-db-ja.com

System.Web.Mvc.HtmlHelperが表示されないカミソリビュー

私はMVC4にアップグレード中です。 http://www.asp.net/whitepapers/mvc4-release-notes#_Toc303253806 の指示に従いましたが、Razorのビューとレイアウトには次のようなエラーがあります

  • 「System.Web.WebPages.Html.HtmlHelper」には「BeginRouteForm」の定義が含まれておらず、「System.Web.WebPages.Html.HtmlHelper」タイプの最初の引数を受け入れる拡張メソッド「BeginRouteForm」が見つかりませんでしたusingディレクティブまたはアセンブリ参照がありませんか?)

次のようなエラーもあります:

  • 「名前 'Viewbag'は現在のコンテキストに存在しません

@Htmlにカーソルを合わせると、System.Web.Mvc.HtmlHelperではなくSystem.Web.WebPages.Html.HtmlHelper型であることがわかります。

他のどの情報が適切であるかは確かではありませんが、これは私がいる場所です:

  • Slnのクラスライブラリなどを.net 4.5にまだ更新していません。
  • プロジェクトはVS2010で作成されましたが、VS2012で移行を行っています
  • プロジェクトが開き、VS2012、.Net 4.0、MVC 3で正常に実行されます

任意のポインタを高く評価しました。

編集: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(または@Paulのソリューションを試してみると/views/shared/web.config )要素には、System.Web.Mvc.WebViewPageを継承する独自のベースタイプがあり、含まれるライブラリの参照がMVC4に更新され、定義に移動するとMVC4 dllに移動します。

新しいリリースのこの領域で何か変更はありますか?リリースノートに関連するものは見当たらない。

68
NikolaiDante

Webアプリケーションでこの問題に遭遇しました-.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. Visual Studioがプロジェクトの横に生成した.userファイルを削除します。
  4. 問題を含むプロジェクトをリロードします
  5. ソリューションを構築する

VS2015の場合.userおよび.slnファイルは、.vsファイルの隣に作成される.sln隠しフォルダーに移動しました。ただし、以下のコメントから、エラーメッセージはツールがMVCの間違ったバージョンを完全に使用していることを暗示しており、このフォルダーを削除しても問題は解決しません。私の知る限り、既知の解決策はありません。

87
Matt DeKrey

MVC 5への更新時に同じ問題が発生しましたが、Viewsフォルダー内の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>

Host-> factoryTypeはversion:4.0.0.0に設定されていて、これが誰にも役立つことを願っています。

25
user3141889

ここですべてのソリューションを試してみましたが、どれもうまくいきませんでした。繰り返しますが、サイトは正常に動作しますが、インテリセンスがなく、Visual Studioが認識しないビューの多くの下に赤い波線が表示されます。それらの1つは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にコピーし、プロジェクト参照で見つかった各アセンブリの番号に一致するようにバージョンを変更しました(言及された各参照を右クリックして[プロパティ]を選択し、[バージョン]選択した参照のプロパティウィンドウの下部にあります)。

上記の実装後、インテリセンスが得られ、Html.BeginFormViewBag.Titleなどのようなものの下に未知の赤い線が表示されなくなりました。

9
David Gunderson

私はプロジェクトをきれいに実行し、すべてをインストールまたは再インストールしましたが、私のサイトが正常にコンパイルおよび実行されていたにもかかわらず、まだ多くのIntellisenseエラーが発生していました。 Viewsフォルダのweb.configファイルのバージョン番号を変更したとき、Intellisenseがようやく機能しました。私の場合、MVCエリアで実行されるOrchardのモジュールをコーディングしていますが、これは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にコピーする必要があります。これにより、MVCベースタイプとパーサーを使用するようにRazorに指示します。詳細はこちらをご覧ください: http://blog.slaks.net/2011/02/dissecting-razor-part-3-razor-and-mvc.html

4
Paul

Visual Studio 2013からVisual Studio 2015にアップグレードした後、この問題に対処していました。この投稿および他の同様のSO投稿で見つかったアドバイスのほとんどを試した後、最終的に問題を発見しました。修正の最初の部分は、私のNuGetをすべて最新バージョンに更新することでした(Nugetバグが発生している場合は、VS13でこれを行う必要があるかもしれません) ViewsWeb.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

すべてを無駄に試してみましたが、私の場合、Webプロジェクトのcsprojファイルの属性値が正しくないため、機能していないことがわかりました。 ToolsVersion14に変更すると、現在の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を最新バージョンに更新することにしました(Update 4)。 90分後に再起動すると、参照は正常に機能しています。お役に立てれば!

2
RichieMN
2
chipples

Visual Studio 2017ユーザー向けの更新:

Visual Studio 2017に移行したばかりで、プロジェクトがMVC4である場合は、VS2017インストーラーに戻り、「ASP.NETとWeb開発」セクションの下のMVC4オプションを確認してください。これはオプションのコンポーネントであり、デフォルトではチェックされていません。

これで問題が解決しました

2
Mike Smith

Matt DeKreyの答えを拡張するために、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-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ブロックを探して、webpages:Versionの値を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

自分で問題の調査を始めたばかりで、これが私の場合のように見えます。 Web設定に正しい値がある場合は、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クラスを維持できるようにしている間、誰もトリックをしませんでした。修正方法は、Main Web.configファイルのみからpageBaseType属性を削除することでした。 View web.configに保存します。

0
Grandizer

私もこの特定の問題に遭遇しました。かみそりタグを使用しようとするとインテリセンスが表示されない(または正しくない)。私の特定の問題は、Html.BeginFormが現在のコンテキストに存在しないことを訴えるVS2015でした。

MVCプロジェクトに領域を設定し、エラーの原因をグローバルweb.configではなく特定の領域のweb.configファイルに絞り込むことができました。

私にとってこの問題の原因は、動作していないエリアのweb.configにSQL connectionStringを追加したことでしたが、これは解析エラーを引き起こしましたが、プロジェクトは正しくコンパイルされました。

ConnectionStringをグローバルweb.configに移動すると、問題が修正されました。うまくいけば、これが他の人に役立つかもしれません。

0
0xFF

そうです、私はしばらくの間この問題を修正しようとしてきました。これに関するさまざまなStack Overflowトピックのすべてのソリューションを使用しましたが、どれも機能していないようです。

今朝問題を修正しました。プロジェクトとビューの両方のweb.configを修正した後、すべての.dllバージョンが参照フォルダーにあるものと一致することを確認します。プロジェクトをアンロードし、.csprojを編集してから、そのファイル内のすべての.dllバージョンを更新する必要があります。

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

この問題がようやく解決したことを願っています!これ以上赤い波線はありません。

これにより、コントローラーやビューなどを追加するオプションが表示されなかった場所で発生していたコンテキストメニューの問題も修正されました。

0
Pavan Dhariwal

私にとっては、それは愚かな展開の間違いでした。Webプロジェクトには複数のweb.configが含まれることがあります。本番環境ではなく開発者のマシンで動作していましたが、展開スクリプトがルートのWeb.configファイルのみを取得し、ViewsWeb.configファイルをコピーしなかったことに気付きませんでしたフォルダ。

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

SOでいくつかの答えに出くわし、最後に、「Html.TextBoxFor」のつづりを間違えたことが私のエラーであることに気付きました。私の場合、私が書いたのは「Html.TextboxFor」です。 TextBoxForでBを大文字にしませんでした。それを修正しました。問題が解決しました。これが誰かの助けになることを願っています。

0