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



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

  • /Themes/Default/Views/{are}/{controller}/{action}.cs.html
  • /模块/{area}/视图/{controller}/{action}.cs.html

如果有人能帮忙,我将不胜感激。

感谢

由于ASP.NET MVC源代码可用,因此通过查看源代码很容易回答这些问题。如果你查看WebFormViewEngine类,你可以看到列出的位置,你很容易从中继承并自定义它们。

然而,不按照惯例使用代码只会让你的生活更加艰难,所以我建议你使用默认位置。

如果有人感兴趣,下面是代码:

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());

希望这能有所帮助。

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

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

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

相关内容

  • 没有找到相关文章

最新更新