我在Visual中创建了一个区域,它会自动在“area”目录中添加适当的位。我将其重命名为"Modules“,但现在当我导航到/{area}/{controller/{action}时,它仍然在/ renamed /{area}/Views/{controller/{action}目录中查找视图,而不是/Modules/{area}/Views/{controller/{action}目录中的视图。我也希望能够推翻对特定主题的看法。因此,我想知道如何自定义默认视图引擎,以便在以下位置查找视图:
如果有人能帮忙我会很感激的。
谢谢
发布于 2011-06-16 13:46:47
由于ASP.NET MVC源代码是可用的,通过查看源代码可以很容易地回答这些问题。如果您查看WebFormViewEngine类,您可以看到列出的位置,您可以很容易地从中继承并自定义它们。
然而,不按照约定的方式使用代码只会使您的生活更加艰难,所以我建议您使用默认的位置。
发布于 2011-06-16 14:15:50
以下是任何人感兴趣的代码:
public class CustomRazorViewEngine : RazorViewEngine {
public CustomRazorViewEngine()
: this(null) {
}
public CustomRazorViewEngine(IViewPageActivator viewPageActivator)
: base(viewPageActivator) {
AreaViewLocationFormats = new[] {
"~/Themes/Default/Views/{2}/{1}/{0}.cshtml",
"~/Themes/Default/Views/{2}/Shared/{0}.cshtml",
"~/Modules/{2}/Views/{1}/{0}.cshtml",
"~/Modules/{2}/Views/Shared/{0}.cshtml"
};
AreaMasterLocationFormats = new[] {
"~/Themes/Default/Views/{2}/{1}/{0}.cshtml",
"~/Themes/Default/Views/{2}/Shared/{0}.cshtml",
"~/Modules/{2}/Views/{1}/{0}.cshtml",
"~/Modules/{2}/Views/Shared/{0}.cshtml"
};
AreaPartialViewLocationFormats = new[] {
"~/Themes/Default/Views/{2}/{1}/{0}.cshtml",
"~/Themes/Default/Views/{2}/Shared/{0}.cshtml",
"~/Modules/{2}/Views/{1}/{0}.cshtml",
"~/Modules/{2}/Views/Shared/{0}.cshtml"
};
}
}现在,只需将以下内容放在Global.asax.cs文件中的Global.asax.cs事件中:
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new CustomRazorViewEngine());希望这能有所帮助。
发布于 2011-06-16 14:26:45
您发布的代码非常类似于几个月前我所做的工作。
我还有一个预处理步骤(按需运行或编译时运行),它查找站点文件夹层次结构中的所有.cshtml文件,并将它们的相对路径添加到数据库中的表中。该站点在启动时缓存数据。然后,自定义视图引擎将搜索该列表中的视图,并仅在找到匹配时检查磁盘。
效果非常非常好。只有当您运行一个非常繁忙的站点时,避免磁盘访问可能会有所帮助。尽管磁盘访问非常缓慢,但它通常不是性能瓶颈,ASP.NET执行自己的智能缓存。
https://stackoverflow.com/questions/6372644
复制相似问题