首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >重写默认的ViewEngine以查看不同的目录

重写默认的ViewEngine以查看不同的目录
EN

Stack Overflow用户
提问于 2011-06-16 13:27:57
回答 3查看 186关注 0票数 0

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

  • /Themes/Default/Views/{area}/{controller}/{action}.cshtml
  • /Modules/{area}/Views/{controller}/{action}.cshtml

如果有人能帮忙我会很感激的。

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-16 13:46:47

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

然而,不按照约定的方式使用代码只会使您的生活更加艰难,所以我建议您使用默认的位置。

票数 1
EN

Stack Overflow用户

发布于 2011-06-16 14:15:50

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

代码语言:javascript
运行
复制
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事件中:

代码语言:javascript
运行
复制
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new CustomRazorViewEngine());

希望这能有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2011-06-16 14:26:45

您发布的代码非常类似于几个月前我所做的工作。

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

效果非常非常好。只有当您运行一个非常繁忙的站点时,避免磁盘访问可能会有所帮助。尽管磁盘访问非常缓慢,但它通常不是性能瓶颈,ASP.NET执行自己的智能缓存。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6372644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档