C# AJAX调用可用于GET,但不能用于POST

C# AJAX调用可用于GET,但不能用于POST,c#,.net,ajax,.net-core,razor-pages,C#,.net,Ajax,.net Core,Razor Pages,下面的AJAX调用对我有效 CSHTML $.ajax({ url: '?handler=Delete', data: { id: $(this).data('id') }, }); $.ajax({ type: 'POST', url: '?handler=Delete', data: { id: $(this).data('id') }, }); CS public void OnGetDelete(

下面的AJAX调用对我有效

CSHTML

$.ajax({
    url: '?handler=Delete',
    data: {
        id: $(this).data('id')
    },
});
$.ajax({
    type: 'POST',
    url: '?handler=Delete',
    data: {
        id: $(this).data('id')
    },
});
CS

public void OnGetDelete(int id)
{
}
public void OnPostDelete(int id)
{
}
但如果我按如下方式更改它,我会得到一个400错误

CSHTML

$.ajax({
    url: '?handler=Delete',
    data: {
        id: $(this).data('id')
    },
});
$.ajax({
    type: 'POST',
    url: '?handler=Delete',
    data: {
        id: $(this).data('id')
    },
});
CS

public void OnGetDelete(int id)
{
}
public void OnPostDelete(int id)
{
}


这篇文章对我来说更有意义。我如何将此作为一篇文章?

Razor页面设计为自动防止跨站点请求伪造(CSRF/XSRF)攻击

请求失败,因为页面上没有AntiForgeryToken

解决方案:

1)尝试添加:

@Html.AntiForgeryToken()
在.cshtml页面的顶部。当您执行此操作时,razor页面将添加一个名为u RequestVerificationToken的隐藏输入,其中包括您的请求令牌

2)更改ajax请求并添加此请求。

beforeSend: function (xhr) {
    xhr.setRequestHeader("XSRF-TOKEN",
        $('input:hidden[name="__RequestVerificationToken"]').val());
},
3)在ConfigureServices方法中配置防伪功能

public void ConfigureServices(IServiceCollection services)
{
    services.AddAntiforgery(o => o.HeaderName = "XSRF-TOKEN");
}
在此之后,您将不再得到400错误


参考:

在您的操作上方添加一个注释,如[httppost],您在CS文件中的方法顶部有“[httppost]”属性。我说的对吗?你能检查一下你浏览器的开发工具并验证
方法是否正确以及有效负载和url是否正确吗?@DavidMcEleney:在我的问题中添加了错误图像。@Benjamin:“'HttpPostAttribute'不能应用于Razor页面处理程序方法。Razor页面的路由必须使用@page指令或使用约定来声明。“我能够通过执行所有三个操作来消除400错误。尽管我目前正在研究另一个错误。我在页面的其他地方得到了
NullReferenceException
。(在Razor代码中)但我不明白为什么它要重新加载我的页面。