我们有一个ASP.NET MVC 4应用程序,其中包含大约3000个视图.我们决定将这组视图拆分为单独的DLL,并使用RazorGenerator进行编译.我们只在主MVC项目中保留主_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);
}
Run Code Online (Sandbox Code Playgroud)
什么行不通:
我无法在其中一个库(比如Partial.cshtml)中定义部分视图的情况下加载主MVC项目中定义的视图(例如_Layout.cshtml).我在控制器的操作中使用以下代码告诉MVC框架我请求了哪个视图:
var view = "~/Views/" + partialName + ".cshtml";
return View(view, "~/Views/Shared/_Layout.cshtml", model);
Run Code Online (Sandbox Code Playgroud)
错误消息显示:未找到视图'〜/ Views/Partial.cshtml'或其主节点,或者没有视图引擎支持搜索的位置.搜索了以下位置:〜/ Views/Partial.cshtml~/Views/Shared/_Layout.cshtml
当我尝试通过指定以下任一项来单独加载视图时:
return View("~/Views/Shared/_Layout.cshtml", model);
Run Code Online (Sandbox Code Playgroud)
要么
return View(view, model);
Run Code Online (Sandbox Code Playgroud)
,找到了正确的观点.但是我需要将它们装在一起.当我在主MVC项目中拥有所有必需的.cshtml文件时,代码可以正常工作.
请注意,已编译的DLL中的视图具有PageVirtualPathAttribute,其路径与控制器操作中指定的路径相同,例如:
namespace SomeBaseNamespace.Views
{
[GeneratedCode("RazorGenerator", "1.5.0.0"), …Run Code Online (Sandbox Code Playgroud)