Razor:asp-page-handler 不会触发处理程序并抛出 400 错误
Posted
技术标签:
【中文标题】Razor:asp-page-handler 不会触发处理程序并抛出 400 错误【英文标题】:Razor : asp-page-handler doesn't trigger handler and throw 400 Error 【发布时间】:2021-03-29 18:38:35 【问题描述】:我需要从带有剃刀页面的购物车中删除一个项目。为此,我使用了带有 asp-page-handler 的表单。
购物车.cshtml:
<td class="text-center">
<form asp-page-handler="Remove" method="post">
<input type="hidden" name="id" value="@line.Product.Id" />
<input type="hidden" name="returnUrl" value="@Model.ReturnUrl" />
<button type="submit" class="btn btn-sm btn-danger">
Remove
</button>
</form>
</td>
我的 Cart.html.cs 有一个 OnPostRemove 方法,如下所示:
public IActionResult OnPostRemove(int id, string returnUrl)
Cart.RemoveLine(Cart.Lines.First(cl =>
cl.Product.Id == id).Product);
return RedirectToPage(new returnUrl = returnUrl );
当我单击删除按钮时,我收到 400 错误,并且我的 OnPostRemove 方法没有触发。
更新
我在我的 _ViewImports.cshtml 中包含了标签助手并解决了问题。
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
【问题讨论】:
嗨@İsmetKonuç,关于这个案例的任何更新?你解决了这个问题吗? 我在我的 _ViewImports.cshtml 中包含了标签助手并解决了问题。 如果不在the_ViewImports.cshtml文件中添加@addTagHelper指令,带有asp-page-handler的表单标签将无法很好地渲染,可能会导致500错误,你确定会导致400错误吗? 如果您按照我的建议使用 F12 开发人员工具“网络”选项卡中发布的数据检查实际请求,您会发现处理程序名称不包含在请求 URL 的查询字符串或路由数据中,如果标签帮助程序是视图不可用。 【参考方案1】:将页面处理程序放在提交按钮标签内。
<form method="post">
...
<button type="submit" asp-page-handler="Remove">
Remove
</button>
</form>
【讨论】:
【参考方案2】:您分享的代码 sn-p 看起来不错,与我这边的测试数据配合得很好。
当我单击删除按钮时,我收到 400 错误,并且我的 OnPostRemove 方法没有触发。
如需排查问题,请在 F12 开发者工具“网络”选项卡中查看实际请求。
请注意,如果启用了antiforgery token validation,但请求不包含有效的防伪令牌或防伪cookie有问题,也会导致400 Bad Request错误。
出于测试目的,您可以尝试通过在页面模型类上应用IgnoreAntiforgeryTokenAttribute
来跳过防伪令牌验证,然后检查请求是否可以按预期处理。
[IgnoreAntiforgeryToken]
public class CartModel : PageModel
【讨论】:
以上是关于Razor:asp-page-handler 不会触发处理程序并抛出 400 错误的主要内容,如果未能解决你的问题,请参考以下文章
.NET Core 3.0:Razor 视图不会在更改时自动重新编译