如何指定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
相关产品推荐
相关产品推荐

