40 votes

Utilisation de VirtualPathProvider pour charger des vues ASP.NET MVC à partir de DLLs

Sur la base de cette question ici et en utilisant le code trouvé ici J'essaie de charger des vues qui sont des ressources intégrées dans un projet DLL séparé, et l'auteur de la question originale dit qu'il a réussi à le faire - mais je n'arrive pas à le faire fonctionner car il semble que le moteur de vue MVC intercepte la requête et continue à chercher la vue dans le système de fichiers. Exception :

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

J'utilise un CustomViewEngine, comme celui de la structure /App de Rob Connery, comme suit :

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

Voici mes itinéraires :

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

Dans mon AssemblyResourceProvider Je vérifie si le chemin d'accès commence par "~/plugin/" et utilise ensuite la convention du nom de fichier de la dll plugin.{controller}.dll.

Des suggestions ?

UPDATE : Au moment où la demande de disons est acheminée http://localhost/plugin/admin arrive au VirtualFileProvider, il n'y a pas de vue attachée à la fin. Ainsi, dans la méthode Open du VirtualFileProvider, le chemin virtuel "~/plugin/admin" est transmis alors qu'il devrait être "~/plugin/admin/Index.aspx" comme défini dans ma route ci-dessus. Est-ce que je me suis trompé dans mes routes ou ai-je raison de m'attendre à ce que cela se produise ?

24voto

jmcd Points 1962
  1. Vous devez enregistrer votre VirtualPathProvider dans le gestionnaire Application_Start de Global.asax.
  2. Vous devez appeler la vue dans votre DLL en utilisant le chemin spécial comme suit : return View("~/Plugin/YOURDLL.dll/FULLNAME_YOUR_VIEW.aspx") ;

Voici un article avec un exemple de code téléchargeable qui le démontre :

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

4voto

Brad Wilson Points 22910

Le moteur d'affichage WebForms intégré utilise les VirtualPathProviders, donc si vous écrivez un VPP et l'enregistrez, vous n'aurez pas besoin d'apporter de modifications au moteur d'affichage.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X