Używanie VirtualPathProvider do ładowania ASP.NET widoki MVC z bibliotek DLL
Bazując na tym pytaniu tutaj i używając kodu znalezionego tutaj próbuję załadować widoki, które są osadzonymi zasobami w oddzielnym projekcie DLL, a autor pytania mówi, że odniósł sukces - ale nie mogę go uruchomić, ponieważ wygląda na to, że silnik widoku MVC przechwytuje żądanie i nadal patrzy na system plików dla widoku. Wyjątek:
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
Używam CustomViewEngine
, jak Rob Connery ' s /app structure one jako następuje:
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;
}
}
Oto moje trasy:
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" });
W moim AssemblyResourceProvider
sprawdzam, czy ścieżka zaczyna się ~/plugin/
, a następnie używam konwencji nazw plików dll plugin.{controller}.dll
UPDATE: zanim przekierowane żądanie say http://localhost/plugin/admin
dotrze do VirtualFileProvider, nie ma żadnego widoku dołączonego na końcu. Tak więc w otwartej metodzie VirtualFileProvider
przekazywana jest wirtualna ścieżka ~/plugin/admin
kiedy powinna być {[10] } zdefiniowana w moim / align = "left" / Pomyliłem trasy, czy mam rację, oczekując, że to się stanie?
2 answers
- musisz zarejestrować swoje
VirtualPathProvider
WGlobal.asax
Application_Start
handler. - musisz wywołać widok w DLL używając specjalnej ścieżki w ten sposób:
return View("~/Plugin/YOURDLL.dll/FULLNAME_YOUR_VIEW.aspx");
Oto artykuł z przykładowym kodem do pobrania, który to demonstruje:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-29 23:30:54
Wbudowany WebFormsViewEngine używa VirtualPathProviders, więc jeśli napiszesz VPP i go zarejestrujesz, nie będziesz musiał wprowadzać żadnych zmian w silniku widoku.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-26 15:07:48