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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:13:27