vista viewcomponent una taghelper que parcial net mvc example component asp asp.net asp.net-mvc virtualpathprovider

asp.net - viewcomponent - view component asp net core



Usar VirtualPathProvider para cargar vistas ASP.NET MVC desde DLL (2)

Basado en esta pregunta here y usando el código que se encuentra here , intento cargar las vistas que son recursos incrustados en un proyecto separado de DLL, y el autor de la pregunta original dice que ha tenido éxito al hacer esto, pero no puedo hacerlo funcionar como parece que el motor de vista MVC está interceptando la solicitud y sigue mirando el sistema de archivos para la vista. Excepción:

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 la estructura de Rob Connery / App uno de la siguiente manera:

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; } }

Aquí están 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 here estoy verificando si la ruta comienza ~/plugin/ y luego usando el plugin.{controller}.dll convención de nombre de archivo dll plugin.{controller}.dll

¿Alguna sugerencia?

ACTUALIZACIÓN: Para cuando la solicitud enrutada para decir http://localhost/plugin/admin está llegando al VirtualFileProvider, no tiene ninguna vista adjunta al final. Por lo tanto, en el método Open de VirtualFileProvider , la ruta virtual de ~/plugin/admin se transfiere cuando debería ser ~/plugin/admin/Index.aspx , tal como se define en mi ruta anterior. ¿He estropeado mis rutas o estoy en lo cierto al esperar que esto suceda?


  1. Debe registrar su VirtualPathProvider dentro del controlador Global.asax Application_Start .
  2. Debe llamar a la vista en su archivo DLL utilizando la ruta especial de la siguiente manera: return View("~/Plugin/YOURDLL.dll/FULLNAME_YOUR_VIEW.aspx");

Aquí hay un artículo con muestra de código descargable que demuestra esto:

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


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.