ASP.NET Core MVC 自定义Login路由后TagHelper生成链接异常问题
问题原因
1. 端点配置嵌套错误
你在UseEndpoints回调中再次调用了app.UseEndpoints,属于错误用法,会导致路由注册顺序混乱,常规路由优先级高于特性路由,最终标签助手生成链接时优先匹配了常规路由规则。
2. 路由优先级冲突
控制器级别的[Route]特性默认优先级和Login动作上的路由优先级一致,标签助手生成链接时会优先匹配符合{controller}/{action}规则的长路径。
3. 控制器路由重复声明
控制器上的两个[Route]特性效果完全重复,属于冗余配置。
修复步骤
第一步:修正端点配置
将嵌套的UseEndpoints合并,调整路由注册顺序:
app.UseEndpoints(endpoints => { endpoints.MapHealthChecks("/health"); endpoints.MapControllers(); // 先注册带culture的常规路由,再注册默认常规路由 endpoints.MapControllerRoute( name: "cultureDefault", pattern: "{culture:culture}/{controller}/{action}"); endpoints.MapControllerRoute( name: "default", pattern: "{controller}/{action}"); });
第二步:调整控制器路由优先级
给控制器级别的Route特性设置更低的优先级(Order值越大优先级越低),删除重复的路由声明:
// 调整Order为10,优先级低于动作上的路由 [Route("[controller]/[action]", Order = 10)] public class AccountsController : Controller { [Route("/Login", Order = 0)] [Route("/{culture}/Login", Order = 1)] public IActionResult Login(short? showLostPasswordInfo) { return View(model); } }
可选方案:指定路由名称生成链接
如果不想调整全局优先级,可以给Login动作的路由指定名称,生成链接时直接绑定路由名:
控制器代码调整:
[Route("/Login", Order = 0, Name = "Login")] [Route("/{culture}/Login", Order = 1, Name = "CultureLogin")] public IActionResult Login(short? showLostPasswordInfo)
链接代码调整:
<!-- 无culture时 --> <a asp-route="Login">...</a> <!-- 带culture时 --> <a asp-route="CultureLogin" asp-route-culture="zh-CN">...</a>
验证
修改完成后重启项目,清空浏览器缓存,此时asp-action="Login"生成的链接会优先匹配动作上定义的/Login或者/{culture}/Login路径。
内容的提问来源于stack exchange,提问作者kmacek
相关产品推荐
相关产品推荐

