Razorベースのビューは参照されたアセンブリを表示しません


101

別のアセンブリのクラスに基づいて、強く型付けされたビューを作成しようとしています。しかし、何らかの理由で、私のRazorビューには、プロジェクトで参照されている他のアセンブリが表示されていないようです。例えば

@model MyClasses.MyModel

Visual Studio 2010では、「タイプまたは名前空間名MyClassesが見つかりませんでした(usingディレクティブまたはアセンブリ参照がありませんか?)」というエラーが発生します。

標準のビューエンジンで参照されている同じクラスが正常に機能します。ビューの本文でクラスを参照しようとすると、同じ問題が発生します。

Razorについて何か不足していますか、それとも他の方法でアセンブリを参照する必要がありますか?


名前空間全体を使用していますか?@model namespace.myclasses.mymodel、たぶん?
Brettski、2011

回答:


107

Razorビューの名前空間を参照するために使用される新しい構成セクションがあります。

フォルダー内のweb.configファイルを開き、Views次のことを確認します。

<configuration>
    <configSections>
        <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
            <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
            <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=1.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=3.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.Routing" />
                <add namespace="SquishIt.Framework" />
                <add namespace="Your.Namespace.Etc" />
            </namespaces>
        </pages>
    </system.web.webPages.razor>
</configuration>

または、usingステートメントを共有レイアウトに追加できます。

@using Your.Namespace.Etc;
<!DOCTYPE html>
<head>
....

Web.configを編集した後、Visual Studioを再起動して変更を適用します。


18
これは機能しますが、アセンブリがで参照されていることを確認してくださいCopy Local = true。それ以外の場合、外部アセンブリは機能しない可能性があります。
Terry

1
ここで、実際のビューファイルを使用する代わりに「仮想」ソース(DBなど)からのビューを使用している場合、ビューのコードが機能するように、これをROOT web.configファイルに配置する必要があることに注意してください。
NightOwl888 2013年

2
@Terry、一部のシステムルートの名前空間アセンブリでも、Copy local = trueが必要であるようです。
Dan Esparza 2013年

2
アセンブリは実行時に読み込まれるため、web.configファイルを使用してそれらを追加できません。他に試すことができるものはありますか?独自のweb.configファイルを使用して外部ビューをインポートする方法はありますか?ビューと同じアセンブリ内の名前空間を参照しているため、これはかなり奇妙です。
Maksim Vi。

Visual Studioを再起動する必要はありません。ビューを閉じて再度開くだけで十分です。
user247702

58

同じ問題がありました:MVC3プロジェクトMyCore.Webが、同じソリューション内の別のプロジェクト(アセンブリ名MyCoreDBLayer)のMyCore.DBLayer名前空間を参照していました。MyCore.DBLayerからすべてのオブジェクトは、コントローラとモデルに完璧に働いていたが、エラーとカミソリのビューに失敗しDBLayerがMyCore 『名前空間に存在しない「『型または名前空間名』』(あなたは、アセンブリ参照が不足している?)」されました明らかにそうではありません。

  • ローカルのコピーオプションがtrueに設定されました。
  • Razorビューに "using ..."ステートメントを追加しても役に立たなかった
  • system.web.webPages.razorセクションに名前空間を追加することも役に立たなかった

ルートweb.configファイルのsystem.web / compilation / assembliesセクションにアセンブリ参照を追加すると、問題が修正されました。セクションは次のようになります。

<system.web>
    <compilation debug="true" targetFramework="4.0">
      <assemblies>
        <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Helpers, Version=1.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=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        **<add assembly="MyCoreDBLayer" />**
      </assemblies>
    </compilation>
...
</system.web>

現時点では、バージョン、カルチャ、トークンを省略しても問題ありませんでしたが、今後修正される予定です。


このソリューションは機能しますが、お勧めできません。すべてのクラスを内部にして、WebアセンブリをMyCoreDBLayerのフレンドにすると、機能しなくなりました。結局、クラスをフレンドアセンブリからラップするMVCモデルとしてパブリッククラスを作成しました。RazorビューでMVCのモデル名前空間以外のクラスを使用しないでください-ラッパーを作成することは常に可能です
VB

これは私にとってはうまくいきました。私はそれをに追加してみましたが、Views/web.configそこに置かれたときにもうまくいきました。
グアノメ2016年

18

私の場合、名前空間を含む個別のプロジェクトはコンソールアプリケーションでした。クラスライブラリに変更すると、問題が修正されました。


1
これで解決しました。最初にクラスライブラリ(パッケージ)を作成しようとしましたが、必要なnugetパッケージの参照で問題が発生しました。ベスト空想を取得し、ちょうど基本クラスライブラリ(DLL)にしない
redwards510

15

上記のいずれも私にとってはうまくいきませんでした。

  • DLLはローカルコピーに設定されました
  • 両方のweb.configsに名前空間を追加しても何も起こらなかった
  • system.web \ compilation \ assembliesへのアセンブリ参照の追加も役に立ちませんでした(ただし、これらの参照は削除していないため、それらも必要になる可能性があります)

しかし、私は最終的に私のために働く何かを見つけました:

これは、ビルド構成がデバッグ構成の場合はbin \ Debug \に、リリース構成の場合はbin \ Release \に移動したためです。(以下の画像のように)すべての構成のビルド構成を「bin \」に変更するとすぐに、すべてが正常に機能し始めました!!!

ビルド構成

ビルドをReleaseフォルダーとDebugフォルダーに分離するとRazor構文が壊れる理由はわかりませんが、何かがアセンブリを見つけられなかったためと思われます。私にとって、かみそりの構文の問題があったプロジェクトは、実際には私の「かみそりライブラリ」プロジェクトです。それらはアプリケーションプロジェクトとして設定されていますが、RazorGeneratorでクラスライブラリとして使用して、ビューをコンパイルします。実際にこれらのプロジェクトの1つを直接実行しようとすると、次の構成エラーが発生しました。

ファイルまたはアセンブリ 'System.Web.Helpers、Version = 3.0.0.0、Culture = neutral、PublicKeyToken = 31bf3856ad364e35'またはその依存関係の1つを読み込めませんでした。システムは、指定されたファイルを見つけることができません。

すべてのWebプロジェクトで、リリースフォルダーとデバッグフォルダーの両方を持つクラスライブラリのデフォルトとは異なり、ビルド出力は常に直接binフォルダーにあるように見えるため、ビルド出力を変更しようとしました。


1
DLLが直接binフォルダーにある場合は、system.web \ compilation \ assembliesセクションが不要であることを確認しました。これは、<compilation debug = "true" targetFramework = "4.5.1" />であることだけに戻ることができます
Sylvia

2
聖なる牛!長い時間をかけて解決策を探した結果、これがようやくクラスライブラリプロジェクトのRazorビューを解決しました。どうもありがとうございます。
Hullah

2
信じられない!ビューのクラスライブラリを別のプロジェクトのディレクトリに構築していたところ、この問題が発生しました。これを機能させるには、ビルドパスをbin \にする必要があります。現在は代わりにビルド後のxcopyを使用しています。
GlacialSpoon 2017

1
クラスライブラリプロジェクトでRazor Engineを使用していますが、同じ問題に直面しました。出力パスを「bin \」に設定すると、この問題も解決されました。GlacialSpoonのように、ビルド後の手順でアセンブリを正しい出力フォルダーにコピーします。最善の方法ではありませんが、少なくとも、Intellisense、参照アセンブリ、構文強調表示は機能します。
オクタン酸

カスタム出力ディレクトリがディレクトリala '.. \ some \ dir \'を指している場合、元の問題が発生することは注目に値します。しかし、出力ディレクトリを「some \ dir \」と変更すると、すべて正常に動作します。これは確かにマトリックスの悪魔のような問題です。
XDS

7

あなたはこの答えを探しているようです:https//stackoverflow.com/a/4136773/176877

つまり、内部のViews \ Web.Config(ルートではない)を開き、Pagesタグの下に名前空間を追加します。

<system.web.webPages.razor>
  <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory.../>
  <pages pageBaseType="System.Web.Mvc.WebViewPage">
    <namespaces>
      <add namespace="System.Web.Mvc" />
      ...
      <add namespace="System.Web.Routing" />
      <!-- Your namespace here -->
    </namespaces>

それを保存し、Razorファイルを閉じて再度開きます。

エリアを使用している場合は、各エリアのWeb.Configごとにこれを行う必要があります。

Visual Studioは長年にわたってバグが多くなっているため、Debugビルドを実行しているRazorファイルを閉じてからRazorファイルを再度開く必要がある場合や、最悪の場合はVisual Studioを再起動する必要がある場合があります。しかし最終的には、そのネームスペースリストのすべてがすべてのビューの上部にある@usingステートメントにあるかのように、Razorファイルが表示されます。


4

ASP.NET MVCのコアソリューションを追加することであるusingASP.NET MVC 5で作業するとき_ViewImports.cshtmlで、代わりにそれを置くのは、Viewフォルダにあるweb.config。

_ViewImports.cshtml

@using mySolution
@using mySolution.ViewModels // <-- Add this, and place your ViewModel (e.g. LoginViewModel) in here.
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

見る

@model LoginViewModel // Add to _ViewImports to make this line work
<div>This is the View for the login screen.</div>

3

私にとっては、コンソールアプリケーションであるプロジェクトを参照していました。クラスライブラリ(DLL)ではなく、exe(コンソールアプリケーション)としてビルドするように設定されていました。これを変更すると、別のプロジェクトのモデルを問題なく見ることができました。


@ user1619480に感謝します。同じ問題があり、私の場合は.Net FrameworkクラスライブラリからVS 2017を使用して追加しましたが、何らかの理由で出力タイプはコンソールアプリケーションでした。
ダンファー

1

RmoのビューでSmoオブジェクトを使用しようとすると、同じエラーが発生しました。どうやらこれは、Razorがプロジェクトで参照されているDLLを見つけられないためです。すべてのSmo dllに対して「ローカルのコピー」をtrueに設定することでこれを解決しましたが、より良い解決策がある可能性があります(上記のCzechdudeのリンクを参照)。タイプ名の一部(たとえば、Microsoft.SqlServer.Management.Smo.Serverの代わりにServer)


1

開発マシンをWin7 32ビットからWin7 64ビットに移動した後、同様のエラーが発生しました。エラーメッセージ:

...\Web\Views\Login.cshtml: ASP.net runtime error: [A]System.Web.WebPages.Razor.Configuration.HostSection cannot be cast to [B]System.Web.WebPages.Razor.Configuration.HostSection. Type A originates from System.Web.WebPages.Razor, Version=1.0.0.0 ... Type B originates from ... Version=2.0.0.0

GACに両方のバージョンがあったことがわかりました。ビューはweb.configv1を参照しましたが、アプリはv2を参照していました。参照されているアセンブリを削除し、v1を再度追加しました。/ System.Web.WebPages.Razorなど


+1 thxこれが私の最後のポイントでした。今、私はasp.net mvc 4 hohohoをデバッグできます!
シティキッド2013年

1

まあ、私にとっては違いました。コンソールアプリケーションプロジェクトとMVCプロジェクトのアセンブリがありませんでした。したがって、参照を追加するだけでは不十分でした。

よくこれは他の誰かを助けるかもしれません。ルートweb.configファイルに移動system.web-> compilation->このようにプロジェクト参照を追加します。

<assemblies> <add assembly="Your.Namespace, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/> </assemblies>


1

私も同じ問題を抱えていましたが、問題はアセンブリのターゲットフレームワークにありました

参照されたアセンブリは、プロジェクトが.NET Framework 4.5に設定された.NET Framework 4.6にありました。

これがフレームワークを台無しにした人に役立つことを願っています。


1

プロジェクトのフォルダ名は同じである必要があります。プロジェクトまたはソリューションの名前が異なる場合、MVCはあなたを傷つけます。

例:新しいアプリケーションを作成し、デフォルトの名前Webapplicaiton1を取得すると、この名前空間が作成されます。したがって、この名前空間を使いたくないとしましょう。そのため、VSから、表示できるすべての場所を「MyNamespace」に変更します。また、「Webapplication1」のすべてのコードを検索して置き換え、「MyNamespace」に置き換えます。これにより、web.configファイルも変更され、

これで、Razorビューを除くすべてが機能します。

RazorViewsはそれを見つけることができません。プロジェクトのFOLDERNAMEにある種の奇妙な依存関係があるためです。ひどいデザインです。

私は自分のファイルを新しいソリューションにコピーすることでこれを完全にテストしました。唯一の違いはフォルダー名です。


これはなんてばかげているでしょう。プロジェクトフォルダー名を正しい名前に変更し、ソリューションをテキストファイルで開き、フォルダーの説明を修正しました。出来た!私はビジュアルスタジオ2019を使用しています
ダニエル

0

あなたMyClassesがいる名前空間をweb.configに追加してみてください

<pages> <namespaces></namespaces> </pages>



0

これらのhttps://stackoverflow.com/a/7597360/808128のどれも私のために機能しません。「ルートweb.configファイルのsystem.web / compilation / assembliesセクションにアセンブリ参照を追加する」こともできます。したがって、私には2つの方法が残っています。1)Razorコードがこのラップを介してこのアセンブリにアクセスできるアセンブリにパブリックラップクラスを追加します。2)Razorのコードが配置されているのと同じアセンブリのパブリッククラスにアセンブリロジックを追加するだけです。


0

<assemblies>およびのweb.configの変更に加えて<namespaces>、アセンブリのGACを実行すると大きな違いが生じることがわかりました。グローバルに登録されているコア.NETアセンブリと同様に、カルチャと公開キートークンを適用できます。

GACの言及に震える人もいます。しかし、BizTalk開発者として、私はそれを受け入れるようになりました。


0

この解決策は私にとってうまくいきました(面白いですが、うまくいきます)

ビューページを編集してコンテンツをコピーして貼り付けました。ビューのコンテンツは変更しませんでしたが、ビジュアルスタジオでページを追跡できるように編集しただけです。その後、すべてが機能し始めました。

解決策-ページを編集して同じページに置き換えるだけです(私のために働いた)



0

私の場合、かみそりクラスライブラリプロジェクトが2.0に設定されているときに、使用しようとしたパッケージが.net標準2.1を参照していた

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.