2008-10-25 13 views
41

Basierend auf dieser Frage here und mit Code gefunden here Ich versuche, Ansichten, die eingebettete Ressourcen in einem separaten DLL-Projekt geladen sind, und der ursprüngliche Frage der Autor sagt er hatte Erfolg dabei - aber ich kann es nicht zum Funktionieren bringen, da es scheint, dass die MVC-View-Engine die Anfrage abfängt und immer noch auf das Dateisystem für die Ansicht schaut. Ausnahme:Verwenden von VirtualPathProvider zum Laden von ASP.NET MVC Ansichten von DLLs

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 

ich CustomViewEngine verwende, wie Rob Connery/App-Struktur ein, wie folgt:

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

Hier sind meine Routen:

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

In meinem AssemblyResourceProvider ich bin Überprüfen, um zu sehen, ob der Pfad ~/plugin/ beginnt und dann die DLL-Dateiname-Konvention verwendet plugin.{controller}.dll

Irgendwelche Vorschläge?

UPDATE: Durch die Zeit, der geroutet Antrag auf etwa http://localhost/plugin/admin wird den VirtualFileProvider bekommt es keine Aussicht am Ende befestigt hat. Also wird in der VirtualFileProvider Open-Methode der virtuelle Pfad von ~/plugin/admin übergeben, wenn es ~/plugin/admin/Index.aspx sein sollte, wie in meiner Route oben definiert. Habe ich meine Routen durcheinander gebracht oder rechne ich damit, dass dies passiert?

+3

Das erste FileExists nennen vor Der Controller wird ausgeführt und muss false zurückgeben, oder IIS versucht, ihn als statische Dateien bereitzustellen. Die Anforderung für die tatsächliche aspx-Datei kommt später, wenn der Controller eine Ansicht anfordert. –

Antwort

25
  1. Sie müssen sich Ihre VirtualPathProvider im Global.asaxApplication_Start Handler.
  2. Sie müssen die Ansicht in der DLL rufen Sie den speziellen Pfad wie folgt: return View("~/Plugin/YOURDLL.dll/FULLNAME_YOUR_VIEW.aspx");

Hier ist ein Artikel mit herunterladbaren Codebeispiel, das diese zeigt: geschieht

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

+0

Was ist Plugin-Ordner? Oder ist es nur ein Namespace? – Mou

+0

der Link für wynia.org ist tot .. – Alok

5

Die integrierte WebFormsViewEngine verwendet VirtualPathProviders. Wenn Sie also ein VPP schreiben und es registrieren, müssen Sie keine Änderungen an der View Engine vornehmen.

+0

Das ist, was ich tue, aber es scheint nicht zu funktionieren :( – jmcd