ASP.NET Core5自定义IViewLocationExpander找不到默认路径视图
问题根因
你的代码存在两个核心错误,导致视图搜索匹配失败:
- 自定义视图路径缺少ASP.NET Core MVC约定的
/Views根目录前缀:你写的/{1}/{0}.cshtml规则会去搜索站点根目录下的/Account/Login.cshtml,但MVC默认视图存放在/Views/Account/Login.cshtml路径,路径完全不匹配,自然无法命中文件。 ExpandViewLocations方法直接返回自定义路径集合,完全丢弃了入参viewLocations中框架内置的默认搜索路径,相当于替换了全部默认搜索规则,而非在默认规则基础上追加自定义路径。
修复步骤
- 修正自定义视图引擎代码,先保留默认搜索路径,再追加正确前缀的自定义模块路径:
public class LibraryViewEngine : IViewLocationExpander { public IEnumerable<string> ExpandViewLocations(ViewLocationExpanderContext context, IEnumerable<string> viewLocations) { // 优先返回框架默认视图搜索路径,不覆盖默认规则 foreach (var defaultLocation in viewLocations) { yield return defaultLocation; } // 追加自定义模块路径,注意补全/Views根目录前缀,和你实际存放路径对应 yield return "/Views/Module1/{1}/{0}.cshtml"; yield return "/Views/Module1/Shared/{0}.cshtml"; } public void PopulateValues(ViewLocationExpanderContext context) { // 无动态切换视图路径的需求时,该方法留空即可 } }
- 检查视图文件属性:确认所有
.cshtml视图文件的生成操作设置为「内容」,复制到输出目录设置为「如果较新则复制」,避免运行时目标目录缺失视图文件。 - 如果你确实需要将视图存放在
/Views目录外(比如你之前尝试的根目录/Account路径),需要额外自定义文件提供程序将对应目录纳入Razor扫描范围,否则默认Razor引擎只会识别/Views、/Pages等约定目录下的视图文件,非约定目录即使路径写对也无法被识别,非必要不建议打破该约定。
修复后重启应用,视图引擎会先搜索默认的/Views/Controller/ViewName.cshtml、/Views/Shared/ViewName.cshtml路径,命中默认位置的视图;默认路径找不到时会继续搜索你配置的Module1目录下的自定义视图,两类路径的视图都可以正常访问。
内容的提问来源于stack exchange,提问作者Avant
相关产品推荐
相关产品推荐

