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
相关产品推荐
相关产品推荐

