Razor Generator: jak używać widoku skompilowanego w bibliotece jako częściowego widoku dla master zdefiniowanego w głównym projekcie mvc
Mamy aplikację ASP.NET MVC 4 z około 3000 widokami. Zdecydowaliśmy się podzielić ten zestaw widoków na oddzielne biblioteki DLL i skompilować je za pomocą RazorGenerator. W głównym projekcie MVC przechowujemy tylko główne pliki _Layout.cshtml i powiązane pliki.
Nie możemy załadować częściowych widoków z DLL wraz z głównym widokiem w głównym projekcie MVC. Szczegółowy opis znajduje się poniżej.
Co już zostało zrobione:
Widoki kompilują się z powodzeniem do bibliotek DLL (potwierdziłem, że są w pliku binarnym)
Obiekt PrecompiledMvcEngine jest tworzony i rejestrowany dla każdej biblioteki DLL zawierającej widoki przy użyciu poniższego kodu w Application_Start w Global.asax.cs:
.
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
{
// ...
// some code determining whether we've got an assembly with views
// ...
var engine = new PrecompiledMvcEngine(assembly);
engine.UsePhysicalViewsIfNewer = true;
ViewEngines.Engines.Insert(0, engine);
// StartPage lookups are done by WebPages.
VirtualPathFactoryManager.RegisterVirtualPathFactory(engine);
}
Co nie działa:
Nie mogę załadować widoku zdefiniowanego w głównym projekcie MVC (powiedzmy _Layout.cshtml) z częściowym widokiem zdefiniowanym w jednej z bibliotek (powiedzmy Partial.cshtml). Korzystam z następującego kodu w akcji kontrolera, aby poinformować platformę MVC, którego widoku zażądałem:
var view = "~/Views/" + partialName + ".cshtml";
return View(view, "~/Views/Shared/_Layout.cshtml", model);
Komunikaty o błędach mówią: Widok '~ / Views / Partial.cshtml' lub jego główny nie został znaleziony lub silnik widoku nie obsługuje wyszukiwanych lokalizacji. Przeszukiwano następujące lokalizacje: ~ / Widoki / Partial.cshtml ~ / Views / Shared / _Layout.cshtml
Kiedy próbuję załadować widoki osobno, określając:
return View("~/Views/Shared/_Layout.cshtml", model);
lub
return View(view, model);
, znaleziono właściwy widok. Jednak muszę je załadować razem. Kod działa, gdy mam wszystkie wymagane pliki .cshtml w głównym projekcie MVC.
Zauważ, że widoki w skompilowanych bibliotekach DLL mają PageVirtualPathAttribute z tą samą ścieżką, jaką określono w akcji kontrolera, np .:
namespace SomeBaseNamespace.Views
{
[GeneratedCode("RazorGenerator", "1.5.0.0"), PageVirtualPath("~/Views/Partial.cshtml")]
public class Partial : WebViewPage<PartialModel>
{
[CompilerGenerated]
private static class <Execute>o__SiteContainer3
{
// logic
}
public override void Execute()
{
// logic
}
}
}
Podsumowując, pytanie brzmi: jak wywołać widok główny zapisany w głównym projekcie MVC z częściowym widokiem skompilowanym zdefiniowanym w innym projekcie?