2008-10-25 14 views
41

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?

+3

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. –

Respuesta

25
  1. Debe registrar su VirtualPathProvider dentro del manejador Global.asaxApplication_Start.
  2. Debe llamar a la vista en el archivo DLL utilizando la vía especial de este modo: return View("~/Plugin/YOURDLL.dll/FULLNAME_YOUR_VIEW.aspx");

He aquí un artículo con el ejemplo de código descargable que demuestra esto:

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

+0

¿qué es la carpeta de Plugin? ¿O es solo un espacio de nombres? – Mou

+0

el enlace de wynia.org está muerto. – Alok

5

El WebFormsViewEngine incorporado utiliza VirtualPathProviders, por lo que si escribe un VPP y lo registra, no necesitará realizar ningún cambio en el motor de visualización.

+0

Eso es lo que estoy haciendo, pero parece que no funciona :( – jmcd

Cuestiones relacionadas