覆盖默认ViewEngine以查找不同的目录

时间:2011-06-16 13:27:57

标签: asp.net asp.net-mvc viewengine

我在Visual Studio中创建了一个区域,它自动在“Areas”目录中添加相应的位。我将其重命名为“模块”但现在当我导航到/ {area} / {controller / {action}时,它仍然在/ Areas / {area} / Views / {controller / {action}目录中查找视图而不是/ Modules / {area} / Views / {controller / {action}目录。我还希望能够覆盖特定主题的视图。因此,我想知道如何自定义默认视图引擎以在以下位置查找视图:

  • /主题/默认/查看/ {面积} / {控制器} / {行动} .cshtml
  • /模块/ {面积} /查看/ {控制器} / {行动} .cshtml

如果有人可以提供帮助,我真的很感激。

由于

3 个答案:

答案 0 :(得分:1)

ASP.NET MVC source code可用时,通过查看来源很容易回答这些问题。如果查看WebFormViewEngine类,您可以看到列出的位置,并且您可以轻松地从中继承并自定义它们。

然而,不按照惯例的方式进行,只会让你的生活更加艰难,所以我建议你住在默认位置。

答案 1 :(得分:1)

以下是任何人都感兴趣的代码:

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文件中的Application_Start事件中:

ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new CustomRazorViewEngine());

希望这有帮助。

答案 2 :(得分:1)

您发布的代码与我几个月前的代码非常相似。

我还有一个预处理步骤(按需运行或在编译时运行),它找到站点文件夹层次结构中的所有.cshtml文件,并将它们的相对路径添加到数据库中的表。该站点在启动时缓存该数据。然后,自定义视图引擎在该列表中搜索视图,并仅在找到匹配时检查磁盘。

这非常非常好。避免磁盘访问可能只会在您运行非常繁忙的站点时提供帮助。尽管磁盘访问速度非常慢,但它通常不是性能瓶颈,ASP.NET会执行自己的智能缓存。