.NET Core 3.1 Razor Pages及AJAX场景下分部页搜索路径设置问题
解决方案
方法1:直接指定全路径引用(最简便,无需全局配置)
Razor 原生支持传入从应用根目录开始的绝对路径调用分部页,完全满足你自定义路径的需求,写法如下:
// 接口直接返回分部视图时 return Partial("~/Areas/Area2/Partials/_SomePartialPagePartial.cshtml", SomeDataModel); // Razor页面内直接渲染时 <partial name="~/Areas/Area2/Partials/_SomePartialPagePartial.cshtml" model="Model.SomeData" />
注意路径必须以~/开头,且带上.cshtml后缀,只要路径正确,无论分部页放在项目任意目录都能正常加载,你提到的「调用时指定路径」的功能本身就已存在,不需要额外优化。
方法2:修复全局搜索路径配置
你之前配置不生效的核心原因是没有针对Area场景配置对应的搜索路径集合,且配置顺序错误:
- Razor Pages中Area相关的视图搜索路径单独存放在
AreaPageViewLocationFormats集合中,而非你用的PageViewLocationFormats(后者仅作用于非Area的Razor Pages) - 配置必须放在
AddRazorPages()之后,否则会被默认配置覆盖
正确配置写法(Startup.cs -> ConfigureServices):
// 先注册Razor Pages服务 services.AddRazorPages(); // 再配置视图引擎选项 services.Configure<RazorViewEngineOptions>(options => { // 新增Area下Partials目录为搜索路径,{2}匹配Area名称,{0}匹配分部页名称 options.AreaPageViewLocationFormats.Add("/Areas/{2}/Partials/{0}.cshtml"); // 如果需要支持控制器返回Area下的分部视图,额外加这行 options.AreaViewLocationFormats.Add("/Areas/{2}/Partials/{0}.cshtml"); });
配置完成后,同一Area下的分部页可以直接写名称调用,比如在Area2的页面里可以直接写return Partial("_SomePartialPagePartial", model),会自动搜索Area2/Partials目录。如果要跨Area调用,还是推荐用方法1的全路径写法,避免不同Area同名分部页冲突。
注意事项
- 若开启了Razor运行时编译,确保分部页所在的
Areas/*/Partials目录被包含在项目文件的编译内容中,默认新建的Area目录都会自动包含,无需额外调整 - 不同Area下存在同名分部页时,全局搜索会优先命中当前调用方所在Area的Partials目录下的文件
内容的提问来源于stack exchange,提问作者MicJarek
相关产品推荐
相关产品推荐

