web-dev-qa-db-ja.com

別のプロジェクトにあるMVCビューにアクセスすることはできますか?

MVCプロジェクトをいくつかのプロジェクトに分割したい

まず最初に、2つのプロジェクトを作成しましたFrontViews

Frontプロジェクトは、コントローラーとモデルを含むWebアプリケーションです

Viewsプロジェクトは、ビューのみを含むクラスライブラリプロジェクトです

私の質問は、コントローラーがViewsプロジェクトにあるビューを呼び出すようにする方法です

このようなコントローラーがあります:

public ActionResult Default()
        {
            return this.View();
        }
24
Mehdi Souregi

MVCはビューをDLLにコンパイルしませんが、代わりにサイトディレクトリのルートからファイルとしてそれらを参照します。場所は、慣例により〜/ Viewsであり、検索パスに従います。これは多かれ少なかれデフォルトのビューエンジンにハードコードされています。

ビューはファイルであるため、ビューを個別のプロジェクトに分割しても、プライマリWebアプリケーションプロジェクトには存在しません。したがって、ビューエンジンはそれらを見つけることができません。アプリをコンパイルすると、参照されるプロジェクトはDLL(および潜在的にpdbなどのその他のいくつかのもの)のみをコピーします

さて、これを回避する方法はありますが、正直なところ、通常、彼らは価値があるよりも厄介です。 mvc contribプロジェクトの「Portable Areas」を調べることができますが、これらは十分にサポートされておらず、それらをNuGetパッケージに置き換えるという話があります。

@ mo.esmpのアドバイスに従ってカスタムビューエンジンを作成することもできますが、ビルドやデプロイ時にサイトがビューにアクセスできる場所にビューをコピーする方法を理解する必要があります。

私の提案は、あなたが説明する方法でプロジェクトを分割しないことです。私はそれに価値を見ません。プロジェクトが非常に大きくなる場合は、代わりにコードをエリアに分け、すべてのエリアコードとデータをまとめます。

明確に相互に依存しているアイテムを、目的に基づいて物事を収集することのみを目的とする別個のアセンブリに分離することには、どのような価値がありますか?モデルは複数のアセンブリで使用できるため、モデルを独自のプロジェクトに分離することには価値があります。ただし、コントローラーとビューは、MVCプライマリサイトでのみ使用されます。

31

コントローラーを含めるには、ルート登録を変更して、コントローラーを探す場所を指示する必要があります。

routes.MapRoute(name: "Default", url: "{controller}/{action}/{id}",
                namespaces: new[] {"[Namespace of the Project that contains your controllers]"},
                defaults: new {controller = "Home", action = "Index", id = UrlParameter.Optional});

カスタムViewEngineを作成するビューを含めるため:

public class CustomViewEngine: RazorViewEngine
{
    public CustomViewEngine()
    {
        MasterLocationFormats = new string[]
        {
            "~/bin/Views/{1}/{0}.cshtml",
            "~/bin/Views/{1}/{0}.vbhtml",
            "~/bin/Views/Shared/{0}.cshtml",
            "~/bin/Views/Shared/{0}.vbhtml"

        };
        ViewLocationFormats = new string[]
        {
             "~/bin/Areas/{2}/Views/{1}/{0}.cshtml",
             "~/bin/Areas/{2}/Views/{1}/{0}.vbhtml",
             "~/bin/Areas/{2}/Views/Shared/{0}.cshtml",
             "~/bin/Areas/{2}/Views/Shared/{0}.vbhtml"
        };
        .
        .
        .
    }
}
protected void Application_Start()
{
    ViewEngines.Engines.Add(new CustomViewEngine());

詳細については、RazorViewEnginのデフォルトの実装をご覧ください。

ここにいくつかの良い記事:

個別のアセンブリにASP.NET MVCコントローラーとビューを保存する

ASP.NET MVC:コントローラーを別のアセンブリに配置する

ASP.NET MVCアプリケーションの外部アセンブリでコントローラーを呼び出す方法

54

ビューをプリコンパイルすることができます-そのように、それらはdllに含まれ、別のプロジェクトから参照できます。

どうやってするの:

  1. ビューを別のプロジェクトに移動する
  2. Visual StudioにRazor Generator拡張機能をインストールする
  3. これらのビューのカスタムツールをRazorGeneratorに変更する
  4. RazorGenerator.Mvc NuGetパッケージをビュープロジェクトに追加します
  5. メインプロジェクトの参照ビュープロジェクト

それでおしまい!

モデルを使用して何かを行う必要がありますが、ビューと一緒に配置するか、モデル用の3番目のプロジェクトを用意します。それ以外の場合は、循環依存関係になります。

別の欠点は、ビューで作業するすべての人がそのRazor Generator拡張機能を必要とすることです。

これが機能する方法は、基本的にデザイン時にVisual Studioがビューから.csファイルを生成するようにすることであり、これらはコンパイルされたdllの一部であり、他のコードと同じです。

5
solo