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 错误的主要内容,如果未能解决你的问题,请参考以下文章

Razor 视图的有界属性在发布后未更新

剃须刀页面 asp-page-handler 按钮不起作用

如何在函数返回之前从 AJAX 调用中获取结果?

.NET Core 3.0:Razor 视图不会在更改时自动重新编译

Razor Pages Anchor Tag Helper 不会从 href 中删除索引

除非重新启动项目,否则 VS .Net Core Razor 页面不会更新