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?
- Debe registrar su
VirtualPathProvider
dentro del controladorGlobal.asax
Application_Start
. - 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:
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.