.NET Core MVC 7路由配置问题:默认路由sign-in无效,需跳转至account/sign-in
问题本质
你的Home控制器方法加了[Route("sign-in")]属性路由后,这个方法就不再走传统默认路由的匹配逻辑了——属性路由会完全接管该方法的访问路径,传统路由里指定的action=sign-in是属性路由的路径,不是方法的实际名称(C#方法名不能有连字符,你的方法实际应该叫signin/SignIn),所以框架找不到对应的Action,导致启动404。而换成原方法名signin后,默认路由能匹配到方法(此时这个方法可能没被属性路由覆盖)。
实现启动直接进入/account/sign-in的方案
方案1:修改默认路由的默认值
直接把默认路由的默认控制器和Action指向Account控制器的目标方法:
app.MapControllerRoute( name: "default", pattern: "{controller=Account}/{action=SignIn}/{id?}");
注意:这里的
action=SignIn要对应Account控制器里方法的实际名称,如果该方法也加了[Route("sign-in")]属性路由,可将属性路由写成[Route("[controller]/sign-in")],让访问路径统一为/account/sign-in。
方案2:根路径重定向(最直接)
在Program.cs的路由配置后,添加根路径的重定向规则,强制启动时跳转到目标页面:
// 放在MapControllerRoute之后 app.MapGet("/", context => context.Response.Redirect("/account/sign-in"));
这种方式不需要改动原有路由规则,直接将网站根路径(启动默认访问的路径)重定向到/account/sign-in,完全符合需求。
方案3:兼容属性路由与传统路由(针对Home控制器的404问题)
如果要解决Home控制器sign-in路径的404问题,需要明确:属性路由和传统路由不能混用同一个方法。要么去掉[Route("sign-in")],让方法走传统路由(此时默认路由的action=signin能匹配);要么给属性路由加上控制器前缀,让路径更清晰:
[Route("[controller]/sign-in")] public IActionResult SignIn() { // 方法逻辑 }
这样该方法的访问路径就是/home/sign-in,和传统路由规则兼容,但这和你要的/account/sign-in无关,所以前两个方案更适用。
关键提醒
- C#方法名不允许包含连字符,所以
[Route("sign-in")]只是给方法设置了一个友好的访问路径,和传统路由里的action参数(对应方法名称)完全是两个概念。 - 属性路由的优先级高于传统路由,只要方法标记了
[Route],传统路由就无法再匹配这个方法,只能通过属性路由定义的路径访问。
内容的提问来源于stack exchange,提问作者code-professional

