ASP.NET Core Identity区域无法识别自定义视图搜索路径问题
我正在开发一个ASP.NET Core Web应用,已将分部视图从/Views/Shared文件夹移至子文件夹/Views/Shared/MenuPartials。
Identity已完全搭建完成,代码位于项目的Areas/Identity/Pages目录下,仅在Manage/Index.cshtml及其后台代码中添加了一些额外字段。
我在Program.cs中添加了视图位置格式配置:
builder.Services.Configure<RazorViewEngineOptions>(options => { // {2} 区域, {1} 控制器,{0} 操作 - 文件夹中的所有操作 options.ViewLocationFormats.Add("/Views/Shared/MenuPartials/{0}" + RazorViewEngine.ViewExtension); });
该配置在非Identity区域的页面中正常工作,但访问Identity页面https://localhost:44347/Identity/Account/Manage时,自定义搜索路径未被识别,抛出异常:
InvalidOperationException: 未找到分部视图“_admin”。已搜索以下位置: /Areas/Identity/Pages/Account/Manage/_admin.cshtml /Areas/Identity/Pages/Account/_admin.cshtml /Areas/Identity/Pages/_admin.cshtml /Areas/Identity/Pages/Shared/_admin.cshtml /Areas/Identity/Views/Shared/_admin.cshtml /Pages/Shared/_admin.cshtml /Views/Shared/_admin.cshtml
为何Identity区域不使用额外的视图发现路径?在非区域页面中测试时,该搜索路径正常(会搜索/Views/Shared/MenuPartials/_admin.cshtml等路径)。
我曾尝试添加以下代码,但无效果:
options.AreaViewLocationFormats.Add("/Views/Shared/MenuPartials/{0}" + RazorViewEngine.ViewExtension);
如何让Identity区域搜索MenuPartials和ButtonPartials文件夹?
因为Identity基于Razor Pages实现,而非传统MVC控制器视图,之前的配置只覆盖了MVC视图的搜索规则,没对Razor Pages生效。需要针对Razor Pages的视图位置规则补充配置:
补充全局Razor Pages视图路径
在Program.cs的配置中,添加PageViewLocationFormats,覆盖非区域Razor Pages的视图搜索范围:builder.Services.Configure<RazorViewEngineOptions>(options => { // 非区域MVC视图路径 options.ViewLocationFormats.Add("/Views/Shared/MenuPartials/{0}" + RazorViewEngine.ViewExtension); options.ViewLocationFormats.Add("/Views/Shared/ButtonPartials/{0}" + RazorViewEngine.ViewExtension); // 非区域Razor Pages视图路径 options.PageViewLocationFormats.Add("/Views/Shared/MenuPartials/{0}" + RazorViewEngine.ViewExtension); options.PageViewLocationFormats.Add("/Views/Shared/ButtonPartials/{0}" + RazorViewEngine.ViewExtension); });添加区域Razor Pages视图路径
针对Identity这类区域内的Razor Pages,必须配置AreaPageViewLocationFormats,让区域页面能搜索到根目录下的自定义共享文件夹:builder.Services.Configure<RazorViewEngineOptions>(options => { // 保留上述配置 // 区域Razor Pages视图路径 options.AreaPageViewLocationFormats.Add("/Views/Shared/MenuPartials/{0}" + RazorViewEngine.ViewExtension); options.AreaPageViewLocationFormats.Add("/Views/Shared/ButtonPartials/{0}" + RazorViewEngine.ViewExtension); });验证要点
配置完成后,Identity区域的Razor Pages查找分部视图时,会自动把/Views/Shared/MenuPartials/_admin.cshtml和/Views/Shared/ButtonPartials/_admin.cshtml加入搜索列表。同时要确认:- 分部视图文件名正确(比如
_admin.cshtml的大小写是否和调用时一致) - 文件夹结构完全匹配配置的路径
- 分部视图文件名正确(比如
内容的提问来源于stack exchange,提问作者bart s

