tom*_*ash 10 viewengine razor asp.net-mvc-4 razorgenerator
我们有一个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"), PageVirtualPath("~/Views/Partial.cshtml")]
public class Partial : WebViewPage<PartialModel>
{
[CompilerGenerated]
private static class <Execute>o__SiteContainer3
{
// logic
}
public override void Execute()
{
// logic
}
}
}
Run Code Online (Sandbox Code Playgroud)
总而言之,问题是如何使用另一个项目中定义的部分编译视图调用存储在主MVC项目中的主视图?
Application_Start调用时并非所有程序集都会加载。添加额外的处理程序:
AppDomain.CurrentDomain.AssemblyLoad += (sender, args) =>
{
// ...
// some code determining whether we've got an assembly with views
// ...
var engine = new PrecompiledMvcEngine(args.LoadedAssembly);
engine.UsePhysicalViewsIfNewer = true;
ViewEngines.Engines.Insert(0, engine);
// StartPage lookups are done by WebPages.
VirtualPathFactoryManager.RegisterVirtualPathFactory(engine);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8206 次 |
| 最近记录: |