Basado en esta pregunta here y utilizando el código encontrado here Estoy intentando cargar vistas que son recursos incrustados en un proyecto DLL independiente, y el autor de la pregunta original dice que ha tenido éxito al hacer esto, pero no puedo hacer que funcione ya que parece que el motor de vista MVC está interceptando la solicitud y sigue mirando el sistema de archivos para la vista. Excepción:Uso de VirtualPathProvider para cargar vistas ASP.NET MVC desde DLL
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
estoy usando un CustomViewEngine
, como/Aplicación estructura de uno de Rob Connery como sigue:
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;
}
}
Éstos son mis rutas:
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" });
En mi AssemblyResourceProvider
estoy comprobando si la ruta comienza ~/plugin/
y luego usando la convención de nombre de archivo dll plugin.{controller}.dll
¿Alguna sugerencia?
ACTUALIZACIÓN: Por el momento la solicitud de enrutado para decir http://localhost/plugin/admin
está llegando al VirtualFileProvider que no tiene ningún punto de vista se adjunta al final. Por lo tanto, en el método VirtualFileProvider
de Open se pasa la ruta virtual de ~/plugin/admin
cuando debería ser ~/plugin/admin/Index.aspx
según lo definido en mi ruta anterior. ¿He estropeado mis rutas o estoy en lo cierto al esperar que esto suceda?
ese primer FileExists llaman sucede antes el controlador se ejecuta y debe devolver falso o IIS intentará mostrarlo como archivos estáticos. La solicitud del archivo aspx real viene más tarde, cuando el controlador solicita una vista. –