web-dev-qa-db-ja.com

Razorベースのビューに参照アセンブリが表示されない

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

@model MyClasses.MyModel

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

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

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

96
techphoria414

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

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

<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を再起動して変更を適用します。

104
quentin-starin

私は同じ問題を抱えていました:MVC3プロジェクトMyCore.Webは、同じソリューション(アセンブリ名MyCoreDBLayer)の別のプロジェクトからMyCore.DBLayer名前空間を参照していました。 MyCore.DBLayerのすべてのオブジェクトは、コントローラーとモデルでは完全に機能しましたが、Razorビューではエラーで失敗しました「タイプまたはネームスペース名「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>

現時点ではバージョン、文化、トークンを省略しても問題ありませんでしたが、今後修正する必要があります。

54
V.B.

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

18
Sam

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

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

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

デバッグ構成の場合はbin\Debug \に、リリース構成の場合はbin\Release \にビルド出力を送信したためです。すべての構成のビルド構成を「bin \」に変更するとすぐに(下の図を参照)、すべてが正常に機能し始めました!!!

Build Configuration

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

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

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

12
Sylvia

あなたはこの答えを探しているようです: 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は長年バグを抱えているため、デバッグビルドを実行しているRazorファイルを閉じてからRazorファイルを再度開くか、最悪の場合Visual Studioを再起動する必要があります。しかし、最終的には、その名前空間リストのすべてがすべてのビューの上部にある@usingステートメントにあるかのように、Razorファイルを表示します。

6
Chris Moschini

ASP.NET Core MVCで解決策は、ASP.NET MVC 5で作業するときにweb.configをViewフォルダーに配置する代わりに、_ViewImports.cshtmlにusingを追加することです。

_ 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
radbyx

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

3
user1619480

開発マシンを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.configはv1を参照していましたが、アプリはv2を参照していました。参照アセンブリを削除し、v1を再追加しました。 System.Web.WebPages.Razorなど.

1
Tim

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

1
Zar Shardan

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

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

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

1
Geeganage

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

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

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

1
Jawand Singh

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

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

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

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

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

1
Jens Tand

MyClassesがあるネームスペースをweb.configの下に追加してみてください

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

0
amurra

名前空間全体を含める

@model namespace.myclasses.mymodel
0
Brettski

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

一部の人々は、GACの言及にぞっとするかもしれません。しかし、BizTalk開発者として、私はそれを受け入れるように成長しました。

0
Mark S

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

0
user808128

スペースネームモデルyourClassModelで、名前クラスの前にpublicを追加します

public class yourClassModel{
    prop
}
0
Milad Jafari

この解決策は私のために働いた(面白いですが、うまくいきます)

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

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

0
Arun Prasad E S