ASP.NET Core 2.0自定义Area视图位置配置报错求助
解决ASP.NET Core MVC中自定义视图位置的问题
嘿,我来帮你搞定这个自定义视图位置的难题!你说新增了/Areas/Views/Shared这个额外的共享视图区域,配置后还是报错,咱们一步步来排查和解决:
方法一:直接配置视图搜索路径
最直接的方式是在服务配置时,把自定义路径添加到MVC的视图位置列表里。根据你的场景,需要区分非区域控制器和区域内控制器的视图搜索规则,分别配置对应的集合:
在Startup.cs(.NET 5及更早)中配置
services.AddMvc() .AddMvcOptions(options => { // 给非区域控制器添加自定义共享视图路径 options.ViewLocationFormats.Add("/Areas/Views/Shared/{0}.cshtml"); // 给区域内控制器添加自定义共享视图路径(如果需要的话) options.AreaViewLocationFormats.Add("/Areas/Views/Shared/{0}.cshtml"); });
在Program.cs(.NET 6+)中配置
var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllersWithViews() .AddMvcOptions(options => { options.ViewLocationFormats.Add("/Areas/Views/Shared/{0}.cshtml"); options.AreaViewLocationFormats.Add("/Areas/Views/Shared/{0}.cshtml"); }); // ... 后续中间件配置
这里的{0}是视图名称的占位符,如果你需要包含控制器或区域名称,可以用{1}(控制器名)、{2}(区域名)来调整路径格式。
方法二:自定义视图位置扩展器(更灵活)
如果你的需求更复杂(比如根据不同场景动态添加路径),可以自定义IViewLocationExpander来扩展视图搜索逻辑:
1. 创建自定义扩展器类
public class CustomSharedViewExpander : IViewLocationExpander { public IEnumerable<string> ExpandViewLocations(ViewLocationExpanderContext context, IEnumerable<string> viewLocations) { // 把自定义路径加到现有搜索列表的最前面(优先搜索) var customPaths = new List<string> { "/Areas/Views/Shared/{0}.cshtml" }; return customPaths.Concat(viewLocations); } public void PopulateValues(ViewLocationExpanderContext context) { // 这里可以添加需要缓存的标识,不需要的话留空即可 } }
2. 注册扩展器
在服务配置中注册这个扩展器:
// Startup.cs services.AddMvc() .AddViewLocationExpander<CustomSharedViewExpander>(); // 或者Program.cs(.NET 6+) builder.Services.AddControllersWithViews() .AddViewLocationExpander<CustomSharedViewExpander>();
排查配置是否生效
当_foo.cshtml不存在时,你可以查看异常信息里的搜索路径列表,如果你的/Areas/Views/Shared/_foo.cshtml没有出现在列表里,说明配置没生效:
InvalidOperationException: The view '_foo' was not found. The following locations were searched:
/Views/Home/_foo.cshtml
/Views/Shared/_foo.cshtml
/Areas/Views/Shared/_foo.cshtml
...
这时候你需要检查:
- 路径拼写是否正确(注意Linux环境区分大小写)
- 配置代码是否写在
AddMvc()/AddControllersWithViews()之后,并且正确调用了AddMvcOptions或AddViewLocationExpander - 视图文件的“复制到输出目录”属性是否设置正确(不过ASP.NET Core默认会直接读取项目目录里的视图,发布时会自动包含)
内容的提问来源于stack exchange,提问作者L. Piotrowski
相关产品推荐
相关产品推荐

