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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 06:06:00