【问题标题】:AJAX call works with GET but not with POSTAJAX 调用适用于 GET 但不适用于 POST
【发布时间】:2020-06-30 20:44:13
【问题描述】:

以下 AJAX 调用对我有用。

CSHTML

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

CS

public void OnGetDelete(int id)
{
}

但如果我按如下方式更改它,我会收到 400 错误。

CSHTML

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

CS

public void OnPostDelete(int id)
{
}

在这里发帖对我来说更有意义。我该如何发这个帖子?

【问题讨论】:

  • 在您的操作上方添加注释,例如 [httppost]
  • 您在 CS 文件中的方法顶部有“[HttpPost]”属性。我说的对吗?
  • 您能否检查浏览器的开发工具并验证method 是否已发布且有效负载和网址是否正确?
  • @DavidMcEleney:在我的问题中添加了错误图片。
  • @Benjamin:“'HttpPostAttribute' 不能应用于 Razor 页面处理程序方法。必须使用 @page 指令或使用约定声明 Razor 页面的路由。”

标签: c# .net ajax .net-core razor-pages


【解决方案1】:

Razor 页面旨在自动防止跨站点请求伪造 (CSRF/XSRF) 攻击。

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

解决方案:

1) 尝试添加:

@Html.AntiForgeryToken()

在您的 .cshtml 页面顶部。执行此操作时,razor 页面将添加一个名为 __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 错误。

参考:https://www.talkingdotnet.com/handle-ajax-requests-in-asp-net-core-razor-pages/

【讨论】:

  • 我能够通过这三个操作来摆脱 400 错误。虽然我目前正在调查另一个错误。
  • 我在页面的其他地方收到了NullReferenceException。 (在 Razor 代码中。)但我不明白为什么它会重新加载我的页面。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-08
  • 2017-01-25
  • 2020-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多