.NET5 MVC跨Area的ActionLink跳转失效如何解决
问题根因
ASP.NET Core 5.0 MVC 采用端点路由机制,出现area被拼为查询字符串、跳转始终落在根站点控制器的核心原因是 路由配置中没有正确注册Area路由规则,或者Area路由的注册顺序错误,框架无法识别area为特殊路由段参数,就会将其当作普通请求查询字符串处理,最终匹配到根站点的默认路由。
你写的控制器[Area("Uploader")]标记、ActionLink代码本身没有问题,网上流传的两种ActionLink写法中,你使用的五参数重载是规范写法,另一种把controller写在路由值对象里的写法容易出现方法重载匹配歧义,不推荐使用。
修复步骤
- 调整路由注册顺序,在
Startup.cs的Configure方法中,将Area路由规则放在默认通用路由之前注册,正确配置代码如下:
app.UseEndpoints(endpoints => { // Area路由必须放在最前面优先匹配,{area:exists}约束会自动校验区域是否存在 endpoints.MapControllerRoute( name: "areas", pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}"); // 原有根站点默认路由,放在Area路由之后 endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); });
- 校验区域文件夹结构符合ASP.NET Core MVC约定,确保Uploader区域的目录层级如下,结构异常也会导致路由匹配失败:
项目根目录/ └── Areas/ └── Uploader/ ├── Controllers/ │ └── HomeController.cs // 已添加[Area("Uploader")]标记的控制器 └── Views/ └── Home/ └── Index.cshtml // 显示"this is the uploader"文本的对应视图
- 配置完成后重启项目,原有ActionLink代码会正确生成
/Uploader(匹配默认控制器、默认Action路由值)或/Uploader/Home/Index格式的路径,点击即可正常跳转到Uploader区域的目标页面,不会再出现?area=Uploader的查询字符串格式。
内容的提问来源于stack exchange,提问作者bmurrell30
相关产品推荐
相关产品推荐

