Использование VirtualPathProvider для загрузки представлений ASP.NET MVC из DLL

Основываясь на этом вопросе здесь и используя код, найденный здесь, я пытаюсь загрузить представления, которые являются встроенными ресурсами, в отдельный проект DLL, и автор оригинального вопроса говорит, что ему это удалось, но я не могу заставить его работать как кажется, что механизм представления MVC перехватывает запрос и все еще просматривает файловую систему для представления. Исключение:

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 

Я использую CustomViewEngine, наподобие первой структуры Роба Коннери / приложения:

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

Вот мои маршруты:

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

В моем AssemblyResourceProvider Я проверяю, начинается ли путь ~/plugin/ а затем с помощью соглашения об имени файла DLL plugin.{controller}.dll

Какие-либо предложения?

ОБНОВЛЕНИЕ: ко времени перенаправленного запроса, скажем, http://localhost/plugin/admin добирается до VirtualFileProvider, к которому в конце не прикреплено никакого представления. Так что в VirtualFileProvider Открытый метод виртуального пути ~/plugin/admin передается, когда это должно быть ~/plugin/admin/Index.aspx как определено в моем маршруте выше. Я испортил свои маршруты или прав, ожидая, что это произойдет?

2 ответа

Решение
  1. Вы должны зарегистрировать свой VirtualPathProvider в пределах Global.asaxApplication_Start обработчик.
  2. Вы должны вызвать представление в вашей DLL, используя специальный путь следующим образом: return View("~/Plugin/YOURDLL.dll/FULLNAME_YOUR_VIEW.aspx");

Вот статья с загружаемым примером кода, демонстрирующая это:

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

Встроенный WebFormsViewEngine использует VirtualPathProviders, поэтому, если вы напишите VPP и зарегистрируете его, вам не нужно будет вносить какие-либо изменения в движок представления.

Другие вопросы по тегам