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

如何指定asp-action但不在URL中显示?ASP.NET Core路由问题

解决ASP.NET Core TagHelper生成自定义路由URL的问题

你的问题在于,当你使用asp-action属性时,TagHelper默认会按照默认路由模板(通常是{controller}/{action}/{id})来构建URL,但你的Action方法使用了自定义的路由模板staff/{id},所以需要明确告诉TagHelper使用这个自定义路由,而不是基于Action名称的默认路由。

下面是两种用asp-*属性实现的正确方式:

方式一:使用命名路由(推荐)

首先给你的自定义路由添加一个名称,这样可以明确指定要使用的路由规则:

public class StaffController { 
    // 给路由添加Name属性,命名为"GetStaff"
    [HttpGet("staff/{id}", Name = "GetStaff")] 
    public async Task<IActionResult> GetStaffMembers(int id) { 
        return View("Staff", new StaffViewModel(id)); 
    } 
}

然后在链接中使用asp-route属性指向这个路由名称,同时传递id参数:

<a asp-route="GetStaff" asp-route-id="@Model.Id">Click here for @Model.Id</a>

这种方式最可靠,尤其是当控制器有多个路由规则时,能精准匹配到你想要的那个路由模板,生成/staff/1这样的URL。

方式二:省略asp-action,依赖路由匹配

如果你的StaffController中只有这一个匹配staff/{id}的路由,也可以省略asp-action属性,只指定控制器和id参数:

<a asp-controller="Staff" asp-route-id="@Model.Id">Click here for @Model.Id</a>

ASP.NET Core的路由系统会自动匹配到staff/{id}这个模板,生成正确的URL。不过这种方式在控制器有多个相似路由时可能会出现匹配歧义,所以更推荐第一种命名路由的方式。

为什么原来的写法不行?

你之前的asp-action="GetStaffMembers"会让TagHelper优先使用默认路由模板,将Action名称作为URL的一部分,所以生成了staff/getstaffmembers/1。而你的Action方法的自定义路由并没有包含Action名称,因此需要绕开默认的基于Action的路由匹配逻辑,改用上述两种方式。

内容的提问来源于stack exchange,提问作者Mark Cooper

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:08:43