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?

questionAnswers(3)

yourAnswerToTheQuestion