Utiliser VirtualPathProvider pour charger ASP.NET vues MVC de DLLs

basé sur cette question ici et en utilisant le code trouvé ici j'essaye 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 eu du succès en faisant cela - mais je ne peux pas le faire fonctionner car il semble que le moteur de vue MVC intercepte la demande et cherche 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 Rob Connery /App structure 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 commence ~/plugin/ et puis en utilisant la convention de nom de fichier dll plugin.{controller}.dll

des suggestions?

mise à JOUR: au moment où les acheminé demande de dire http://localhost/plugin/admin est d'arriver à la VirtualFileProvider n'a pas de vue à la fin. Ainsi, dans la méthode ouverte de VirtualFileProvider le chemin virtuel de ~/plugin/admin est passé dans quand il devrait être ~/plugin/admin/Index.aspx comme défini dans ma route ci-dessus. Ai-je foiré mes itinéraires ou suis-je en droit de s'attendre à ce que cela arrive?

41
demandé sur Community 2008-10-26 00:24:12

2 réponses

  1. Vous devez enregistrer votre VirtualPathProvider dans le Global.asax Application_Start gestionnaire.
  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 démontre ceci:

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

25
répondu jmcd 2016-03-29 23:30:54

le WebFormsViewEngine intégré utilise des fournisseurs VirtualPath, donc si vous écrivez un VPP et l'enregistrez, vous n'aurez pas besoin d'apporter des modifications au moteur de vue.

5
répondu Brad Wilson 2008-10-26 15:07:48