Razor Generator: как использовать представление, скомпилированное в библиотеке, как частичное представление для мастера, определенного в основном проекте MVC

У нас есть приложение ASP.NET MVC 4, содержащее около 3000 представлений. Мы'Мы решили разделить этот набор представлений на отдельные библиотеки DLL и скомпилировать его с помощью RazorGenerator. Мы сохраняем только основные _Layout.cshtml и связанные файлы в основном проекте MVC.

Мы не можем загрузить частичные представления из DLL вместе с главным представлением в основном проекте MVC. Подробное описание ниже.

Что уже сделано:

Представления успешно компилируются в библиотеки DLL (ямы подтвердили, что они в двоичном виде)

Объект PrecompiledMvcEngine создается и регистрируется для каждой библиотеки DLL, содержащей представления, с использованием приведенного ниже кода в Application_Start в 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);
}

Что не работает:

Я не могу загрузить представление, определенное в основном проекте MVC (скажем, _Layout.cshtml) с частичным представлением, определенным в одной из библиотек (скажем, Partial.cshtml). Я использую следующий код в контроллереДействие, чтобы сообщить платформе MVC, какое представление я запросил:

var view = "~/Views/" + partialName + ".cshtml";    
return View(view, "~/Views/Shared/_Layout.cshtml", model);

В сообщениях об ошибках написано:~ / Views / Partial.cshtml» или его мастер не был найден, или никакой механизм просмотра не поддерживает искомые местоположения. Были найдены следующие местоположения: ~ / Views / Partial.cshtml ~ / Views / Shared / _Layout.cshtml

Когда я пытаюсь загрузить виды отдельно, указав либо:

return View("~/Views/Shared/_Layout.cshtml", model);

или же

return View(view, model);

, правильный вид найден. Однако мне нужно, чтобы они были загружены вместе. Код работает, когда у меня есть все необходимые файлы .cshtml в основном проекте MVC.

Обратите внимание, что представления в скомпилированных DLL имеют PageVirtualPathAttribute с тем же путем, который указан в действии контроллера, например:

namespace SomeBaseNamespace.Views
{
    [GeneratedCode("RazorGenerator", "1.5.0.0"), PageVirtualPath("~/Views/Partial.cshtml")]
    public class Partial : WebViewPage
    {
        [CompilerGenerated]
        private static class o__SiteContainer3
        {
            // logic
        }

        public override void Execute()
        {
            // logic
        }
    }
}

Подводя итог, возникает вопрос: как вызвать главное представление, хранящееся в основном проекте MVC, с частично скомпилированным представлением, определенным в другом проекте?

Ответы на вопрос(3)

Ваш ответ на вопрос