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?
VirtualPathProvider
dans le Global.asax
Application_Start
Gestionnaire.return View("~/Plugin/YOURDLL.dll/FULLNAME_YOUR_VIEW.aspx");
Voici un article avec un exemple de code téléchargeable qui démontre ceci:
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.