Использование 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 ответа
- Вы должны зарегистрировать свой
VirtualPathProvider
в пределахGlobal.asax
Application_Start
обработчик. - Вы должны вызвать представление в вашей DLL, используя специальный путь следующим образом:
return View("~/Plugin/YOURDLL.dll/FULLNAME_YOUR_VIEW.aspx");
Вот статья с загружаемым примером кода, демонстрирующая это:
Встроенный WebFormsViewEngine использует VirtualPathProviders, поэтому, если вы напишите VPP и зарегистрируете его, вам не нужно будет вносить какие-либо изменения в движок представления.