web-dev-qa-db-ja.com

VirtualPathProviderを使用してDLLからASP.NET MVCビューを読み込む

この質問に基づいて ここ および見つかったコードを使用して ここ 別のDLLプロジェクトに埋め込まれたリソースであるビューをロードしようとしています、元の質問の作者は、これは成功したと言っていますが、MVCビューエンジンがリクエストをインターセプトし、ビューのファイルシステムをまだ見ているように見えるので、私はそれを機能させることができません。例外:

Server Error in '/' Application.
The view 'Index' or its master could not be found. The following locations were searched:
~/Views/admin/Index.aspx
~/Views/admin/Index.ascx
~/Views/Shared/Index.aspx
~/Views/Shared/Index.ascx
~/App/Views/admin/Index.aspx
~/App/Views/admin/Index.ascx
~/App/Views/Shared/Index.aspx
~/App/Views/Shared/Index.ascx 

次のように、Rob Conneryの/ App構造体のようなCustomViewEngineを使用しています。

public class CustomViewEngine : WebFormViewEngine
    {
         public CustomViewEngine()
         {
             MasterLocationFormats = new[] { 
                "~/App/Views/{1}/{0}.master", 
                "~/App/Views/Shared/{0}.master" 
                };

             ViewLocationFormats = new[] { 
                "~/App/Views/{1}/{0}.aspx", 
                "~/App/Views/{1}/{0}.ascx", 
                "~/App/Views/Shared/{0}.aspx", 
                "~/App/Views/Shared/{0}.ascx" 
                };

             PartialViewLocationFormats = ViewLocationFormats;
         }
    }

これが私のルートです:

    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute("Home", "", new {controller = "Page", action = "Index", id = "Default"});
    routes.MapRoute("Default", "Page/{id}", new { controller = "Page", action = "Index", id = "" });
    routes.MapRoute("Plugins", "plugin/{controller}/{action}", new { controller = "", action = "Index", id = "" });
    routes.MapRoute("Error", "{*url}", new { controller = "Error", action = "ResourceNotFound404" });

私の AssemblyResourceProvider パスが~/plugin/で始まるかどうかを確認し、dllファイル名の規則plugin.{controller}.dllを使用しています

助言がありますか?

UPDATE:たとえばhttp://localhost/plugin/adminのルーティングされたリクエストがVirtualFileProviderに到達するまでには、最後にビューがアタッチされていません。したがって、VirtualFileProviderのOpenメソッドでは、上記のルートで定義されている~/plugin/adminであるはずのときに、~/plugin/admin/Index.aspxの仮想パスが渡されています。私は自分のルートを台無しにしたか、またはこれが起こることを期待する権利がありますか?

40
jmcd
  1. _Global.asax_ _Application_Start_ハンドラー内でVirtualPathProviderを登録する必要があります。
  2. DLLでビューを呼び出すには、次のような特別なパスを使用する必要があります。return View("~/Plugin/YOURDLL.dll/FULLNAME_YOUR_VIEW.aspx");

これを示すダウンロード可能なコードサンプルの記事は次のとおりです。

http://www.wynia.org/wordpress/2008/12/aspnet-mvc-plugins/

24
jmcd

組み込みのWebFormsViewEngineはVirtualPathProvidersを使用するため、VPPを記述して登録する場合、ビューエンジンに変更を加える必要はありません。

4
Brad Wilson