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

ASP.NET Core MVC控制器Action自定义URL配置及asp-action跳转报错解决

核心问题原因

  1. asp-action属性仅可填写控制器下的动作方法名称,你传入了包含/的路径片段,框架会将其视为动作名称的一部分,自动对/做URL编码,是导致生成错误链接的直接原因。
  2. 特性路由中定义的参数名为year,视图生成链接时使用了asp-route-id,参数名不匹配导致路由无法正确绑定。
  3. 原始学年参数包含/字符,和你期望的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 14:06:01