如何修改ASP.NET MVC视图搜索位置顺序,优先检索Common文件夹?
嘿,这个需求其实很好实现,咱们只需要自定义视图引擎的搜索路径,把默认的Shared文件夹替换成你要的Common,同时保留控制器对应视图文件夹的优先级就行。下面一步步来操作:
ASP.NET MVC的视图搜索逻辑默认由RazorViewEngine(对应Razor视图)或WebFormViewEngine(对应WebForm视图)控制,咱们通过继承并重写这类引擎的路径配置,就能完全按照你的需求调整搜索顺序。
1. 创建自定义Razor视图引擎类
在项目里新建一个类,比如CustomRazorViewEngine,继承自RazorViewEngine,然后在构造函数里重新定义视图搜索路径数组,严格按照你要的顺序排列:
using System.Web.Mvc; public class CustomRazorViewEngine : RazorViewEngine { public CustomRazorViewEngine() { // 自定义视图搜索路径,{0}代表视图名,{1}代表控制器名 ViewLocationFormats = new[] { "~/Views/{1}/{0}.cshtml", "~/Views/{1}/{0}.vbhtml", "~/Views/Common/{0}.cshtml", "~/Views/Common/{0}.vbhtml" }; // 如果需要部分视图也遵循同样规则,同步修改PartialViewLocationFormats PartialViewLocationFormats = new[] { "~/Views/{1}/{0}.cshtml", "~/Views/{1}/{0}.vbhtml", "~/Views/Common/{0}.cshtml", "~/Views/Common/{0}.vbhtml" }; } }
2. 注册自定义视图引擎
接下来要在项目的初始化代码里替换掉默认的视图引擎,以传统MVC项目的Global.asax.cs为例,在Application_Start方法中添加如下代码:
protected void Application_Start() { // 先清除系统默认的视图引擎 ViewEngines.Engines.Clear(); // 注册咱们自定义的视图引擎 ViewEngines.Engines.Add(new CustomRazorViewEngine()); // 保留项目原有的其他初始化逻辑,比如路由注册等 RouteConfig.RegisterRoutes(RouteTable.Routes); }
如果是基于OWIN的MVC项目,就把这段注册代码放到Startup.cs的配置方法里即可。
3. 验证效果
现在测试一下:当Home控制器调用Index视图时,系统会先查找~/Views/Home/Index.cshtml,找不到就找~/Views/Home/Index.vbhtml,如果这两个都不存在,就会去~/Views/Common/Index.cshtml和~/Views/Common/Index.vbhtml里依次查找,完全符合你设定的搜索顺序。
要是你的项目还在用WebForm视图(.aspx/.ascx),可以用同样的逻辑自定义WebFormViewEngine,修改对应的路径格式就行。
内容的提问来源于stack exchange,提问作者Joe herman

