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

ASP.NET Core Razor表单POST未指向正确路由的解决方法

解决方法

问题出在你的Razor表单使用asp-action指定动作方法名,但控制器动作通过[HttpPost("watched-product/{id}")]定义了自定义路由模板,而非默认的controller/action路由规则,因此需要调整表单的路由生成逻辑来匹配自定义路由。

方案一:直接匹配自定义路由参数

修改Razor表单代码,移除asp-action,添加asp-route-id来传递路由参数:

<form method="post" asp-controller="Cryptocurrency" asp-route-id="@providerItem.Item.Id">
    <button type="submit" class="btn btn-danger">Delete</button>
</form>

可以移除按钮上的name="id"和value="@providerItem.Item.Id",因为asp-route-id已经将id嵌入到URL的路由部分,控制器的[FromRoute]string id可以直接捕获该参数。

方案二:给路由命名(更具可读性)

先给控制器的动作路由添加名称,方便后续引用:

[HttpPost("watched-product/{id}", Name = "DeleteWatchedProduct")]
public IActionResult DeleteWatchedProduct([FromRoute]string id)
{
    return RedirectToAction("WatchedProducts", new { deletedId = id });
}

然后在Razor表单中使用asp-route指定路由名称,配合asp-route-id传递参数:

<form method="post" asp-route="DeleteWatchedProduct" asp-route-id="@providerItem.Item.Id">
    <button type="submit" class="btn btn-danger">Delete</button>
</form>

原代码不生效的原因

原表单的asp-action="DeleteWatchedProduct"会让TagHelper按照默认路由规则生成/cryptocurrency/deletewatchedproduct的URL,但你的控制器动作并没有绑定到这个URL,而是绑定到了自定义的watched-product/{id}路由模板,因此无法匹配。

内容的提问来源于stack exchange,提问作者Teoman shipahi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 03:35:23