Używanie VirtualPathProvider do ładowania ASP.NET widoki MVC z bibliotek DLL

Bazując na tym pytaniu tutaj i używając kodu znalezionego tutaj próbuję załadować widoki, które są osadzonymi zasobami w oddzielnym projekcie DLL, a autor pytania mówi, że odniósł sukces - ale nie mogę go uruchomić, ponieważ wygląda na to, że silnik widoku MVC przechwytuje żądanie i nadal patrzy na system plików dla widoku. Wyjątek:

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 

Używam CustomViewEngine, jak Rob Connery ' s /app structure one jako następuje:

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;
         }
    }

Oto moje trasy:

    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" });

W moim AssemblyResourceProvider sprawdzam, czy ścieżka zaczyna się ~/plugin/, a następnie używam konwencji nazw plików dll plugin.{controller}.dll

Jakieś sugestie?

UPDATE: zanim przekierowane żądanie say http://localhost/plugin/admin dotrze do VirtualFileProvider, nie ma żadnego widoku dołączonego na końcu. Tak więc w otwartej metodzie VirtualFileProvider przekazywana jest wirtualna ścieżka ~/plugin/admin kiedy powinna być {[10] } zdefiniowana w moim / align = "left" / Pomyliłem trasy, czy mam rację, oczekując, że to się stanie?

Author: Community, 2008-10-26

2 answers

  1. musisz zarejestrować swoje VirtualPathProvider W Global.asax Application_Start handler.
  2. musisz wywołać widok w DLL używając specjalnej ścieżki w ten sposób: return View("~/Plugin/YOURDLL.dll/FULLNAME_YOUR_VIEW.aspx");

Oto artykuł z przykładowym kodem do pobrania, który to demonstruje:

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

 25
Author: jmcd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-29 23:30:54

Wbudowany WebFormsViewEngine używa VirtualPathProviders, więc jeśli napiszesz VPP i go zarejestrujesz, nie będziesz musiał wprowadzać żadnych zmian w silniku widoku.

 5
Author: Brad Wilson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-26 15:07:48