ASP.NET Core MVC控制器Action自定义URL配置及asp-action跳转报错解决
核心问题原因
asp-action属性仅可填写控制器下的动作方法名称,你传入了包含/的路径片段,框架会将其视为动作名称的一部分,自动对/做URL编码,是导致生成错误链接的直接原因。- 特性路由中定义的参数名为
year,视图生成链接时使用了asp-route-id,参数名不匹配导致路由无法正确绑定。 - 原始学年参数包含
/字符,和你期望的URL中2122格式不匹配,需要提前做字符处理。
解决方案
1. 控制器路由配置
保持你已有的特性路由配置即可,可根据需要添加参数约束:
// 约束year参数长度为4,匹配2122这类格式 [Route("~/Envelope/List/AcademicYear/{year:length(4)}")] public IActionResult AcademicYear(string year) { // 你的业务逻辑 return View("List", newViewModel); }
2. 视图链接生成代码
修正asp-action取值为动作名AcademicYear,补充asp-controller指定控制器,参数名改为和路由匹配的year,同时处理掉学年参数中的/:
<a asp-action="AcademicYear" asp-controller="Envelope" asp-route-year="@Model.AcademicYear.Replace("/","")"> @Model.AcademicYear </a>
可选:全局路由配置方案
如果你不想用特性路由,也可以在程序启动配置的路由规则中,在默认路由前新增一条自定义路由:
// .NET 6+ Program.cs 中配置 app.MapControllerRoute( name: "EnvelopeAcademicYear", pattern: "Envelope/List/AcademicYear/{year:length(4)}", defaults: new { controller = "Envelope", action = "AcademicYear" }); // 原有默认路由放在后面 app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
视图生成链接的代码和上面一致,无需修改。
内容的提问来源于stack exchange,提问作者LewDanks
相关产品推荐
相关产品推荐

