web-dev-qa-db-fra.com

Utilisation de VirtualPathProvider pour charger les vues ASP.NET MVC à partir de DLLS

Basé sur cette question ici et à l'aide de code trouvé ici J'essaie de charger des vues intégrées dans un projet distinct DLL, Et l'auteur de la question initiale a déclaré qu'il a eu du succès à faire cela - mais je ne peux pas le faire fonctionner comme il semble que le moteur View MVC intercepte la demande et examine toujours le système de fichiers pour la vue. 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 la structure/l'application de Rob Connery One 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 veux voir si le chemin commence ~/plugin/, puis en utilisant la convention de nom de fichier DLL plugin.{controller}.dll

Aucune suggestion?

Mise à jour: Au moment où la demande routée de dites http://localhost/plugin/admin passe au virtualfileProvider, il n'a aucune idée attachée à la fin. Donc, dans la méthode ouverte VirtualFileProvider le trajet virtuel de ~/plugin/admin est en cours de transmission quand il devrait être ~/plugin/admin/Index.aspx tel que défini dans mon itinéraire ci-dessus. Ai-je foiré mes itinéraires ou ai-je raison de m'attendre à ce que cela se produise?

40
jmcd
  1. Vous devez enregistrer votre VirtualPathProvider dans le Global.asaxApplication_Start Gestionnaire.
  2. Vous devez appeler la vue dans votre DLL à l'aide du chemin spécial, comme: return View("~/Plugin/YOURDLL.dll/FULLNAME_YOUR_VIEW.aspx");

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

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

24
jmcd

L'intégré WebFormsViewengine utilise VirtualPathProviders, donc si vous écrivez un VPP et enregistrez-le, vous n'avez pas besoin de modifier le moteur de vue.

4
Brad Wilson