2008-10-25 79 views
41

Na podstawie tego pytania here i za pomocą kodu znalezionego here Próbuję wczytać widoki, które są osadzonymi zasobami w oddzielnym projekcie DLL, a autor oryginalnego pytania mówi, że miał Sukces to robi - ale nie mogę zmusić go do działania, ponieważ wygląda na to, że silnik widoku MVC przechwytuje żądanie i wciąż patrzy na system plików dla widoku. Wyjątek:Używanie programu VirtualPathProvider do ładowania widoków MVC ASP.NET z bibliotek DLL

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 struktura jednego Rob Connery/app następująco:

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 jestem sprawdzanie, czy ścieżka rozpoczyna się od ~/plugin/, a następnie użycie konwencji nazw pliku DLL plugin.{controller}.dll

Jakieś sugestie?

UPDATE: Do czasu kierowany wniosek o powiedzmy http://localhost/plugin/admin jest dotarcie do VirtualFileProvider nie ma żadnego widoku załączony na końcu. Tak więc w metodzie Open metody VirtualFileProvider jest przekazywana wirtualna ścieżka ~/plugin/admin, gdy powinna być ~/plugin/admin/Index.aspx zdefiniowana na powyższej trasie. Czy zawiodłem moje trasy lub czy mam rację, oczekując, że tak się stanie?

+3

że najpierw FileExists nazywają się dzieje przed kontroler działa i musi zwrócić wartość false lub program IIS spróbuje podać go jako plik statyczny. Żądanie faktycznego pliku aspx pojawia się później, gdy kontroler zażąda wyświetlenia. –

Odpowiedz

25
  1. należy zarejestrować VirtualPathProvider ramach obsługi Global.asaxApplication_Start.
  2. Musisz zadzwonić do widoku biblioteki DLL przy użyciu specjalnego ścieżkę tak: return View("~/Plugin/YOURDLL.dll/FULLNAME_YOUR_VIEW.aspx");

Oto artykuł z pobrania próbki kodu, który pokazuje to:

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

+0

co to jest folder Plugin? Lub czy to tylko przestrzeń nazw? – Mou

+0

link do wynia.org jest martwy .. – Alok

5

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

+0

To właśnie robię, ale wygląda na to, że nie działa :( – jmcd