我们有一个 ASP.NET MVC 4 应用程序,其中包含大约 3000 个视图。我们决定将这组视图拆分为单独的 DLL,并使用 RazorGenerator 对其进行编译。我们在主 MVC 项目中只保留 main _Layout.cshtml 和相关文件。
我们无法从 DLL 加载部分视图以及主 MVC 项目中的主视图。详细说明如下。
已经做了什么:
视图成功编译成 DLL(我已经确认它们在二进制文件中)
使用 Global.asax.cs 中 Application_Start 中的以下代码为每个包含视图的 DLL 创建和注册 PrecompiledMvcEngine 对象:
.
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);
,找到正确的视图。但是我需要将它们一起加载。当我在主 MVC 项目中拥有所有必需的 .cshtml 文件时,该代码有效。
请注意,已编译 DLL 中的视图具有 PageVirtualPathAttribute,其路径与控制器操作中指定的路径相同,例如:
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
}
}
}
综上所述,问题是如何用另一个项目中定义的部分编译视图调用存储在主 MVC 项目中的主视图?