You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core5自定义IViewLocationExpander找不到默认路径视图

问题根因

你的代码存在两个核心错误,导致视图搜索匹配失败:

  • 自定义视图路径缺少ASP.NET Core MVC约定的/Views根目录前缀:你写的/{1}/{0}.cshtml规则会去搜索站点根目录下的/Account/Login.cshtml,但MVC默认视图存放在/Views/Account/Login.cshtml路径,路径完全不匹配,自然无法命中文件。
  • ExpandViewLocations方法直接返回自定义路径集合,完全丢弃了入参viewLocations中框架内置的默认搜索路径,相当于替换了全部默认搜索规则,而非在默认规则基础上追加自定义路径。
修复步骤
  1. 修正自定义视图引擎代码,先保留默认搜索路径,再追加正确前缀的自定义模块路径:
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)
    {
        // 无动态切换视图路径的需求时,该方法留空即可
    }
}
  1. 检查视图文件属性:确认所有.cshtml视图文件的生成操作设置为「内容」,复制到输出目录设置为「如果较新则复制」,避免运行时目标目录缺失视图文件。
  2. 如果你确实需要将视图存放在/Views目录外(比如你之前尝试的根目录/Account路径),需要额外自定义文件提供程序将对应目录纳入Razor扫描范围,否则默认Razor引擎只会识别/Views、/Pages等约定目录下的视图文件,非约定目录即使路径写对也无法被识别,非必要不建议打破该约定。

修复后重启应用,视图引擎会先搜索默认的/Views/Controller/ViewName.cshtml、/Views/Shared/ViewName.cshtml路径,命中默认位置的视图;默认路径找不到时会继续搜索你配置的Module1目录下的自定义视图,两类路径的视图都可以正常访问。

内容的提问来源于stack exchange,提问作者Avant

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 22:45:50