Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 覆盖默认的ViewEngine以查看不同的目录_Asp.net_Asp.net Mvc_Viewengine - Fatal编程技术网

Asp.net 覆盖默认的ViewEngine以查看不同的目录

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

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

  • /Themes/Default/Views/{area}/{controller}/{action}.cshtml
  • /模块/{area}/Views/{controller}/{action}.cshtml
如果有人能帮忙,我会非常感激的

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

然而,不采用按惯例编码的方法只会让你的生活更加艰难,所以我建议你选择默认位置。

如果可以,通过查看源代码来回答这些问题是很容易的。如果你查看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());

希望这有帮助。

以下是代码,以防有人感兴趣:

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执行自己的智能缓存。

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

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


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

您好,谢谢,我已经发布了我使用的代码,以防它对任何人都有帮助。您好,谢谢,我已经发布了我使用的代码如果它对任何人都有帮助。谢谢,如果性能成为问题,我会记住这一点。谢谢,如果性能成为问题,我会记住这一点。