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, с частично скомпилированным представлением, определенным в другом проекте?