【问题标题】:.NET CORE Razor Pages Ajax call to C# method.NET CORE Razor Pages Ajax 调用 C# 方法
【发布时间】:2018-11-08 05:54:15
【问题描述】:

我目前正在制作一个在谷歌地图上显示位置的网站。我从 Airtable.com 数据库中获取位置地址,并且一切正常。然而,因为谷歌只允许一定数量的地址地理编码请求,我想将坐标保存在同一个数据库中,所以我只在需要查找新位置(地址)时使用地理编码 api。我已经完成了所有设置,但我似乎无法弄清楚如何在剃刀页面中从 js 调用 cs 方法。我过去使用过 WebMethod,但我显然不能在这里使用它。

当我尝试使用我在网上找到的示例时,它说我需要 RequestVerificationToken,但这需要来自表单内的调用(对吗?),并且在网站加载时提示我的 ajax 调用和它从数据库中获取一个还没有任何坐标的位置。

这是我第一次使用 Razor Pages,如果我完全误解了某些内容,请多多包涵。

我想调用的cs方法的图片(Index.cshtml.cs) I tried with the httpPost tag, but it didn't make a difference

    [HttpPost] // RequestVerificationToken
    public void OnPostGeoLocation()
    {
        // Just to test that it actually gets called
        Console.WriteLine("OnPostGeoLocation CALLED ####################################");
        Console.WriteLine("OnPostGeoLocation CALLED ####################################");
        Console.WriteLine("OnPostGeoLocation CALLED ####################################");
        Console.WriteLine("OnPostGeoLocation CALLED ####################################");
    }

从JavaScript调用Ajax的图片,基本上是在页面加载时调用:AjaxCall

function updateRow(recordID, latLng) {
   console.log("REC_ID: " + recordID);
   console.log("LatLng: " + latLng);
   $.ajax({
       type: "POST",
       url: '/Index?OnPostGeoLocation', 
       contentType: "application/json; charset=utf-8",
       dataType: "json"
   }).done(function (data) {
       console.log(data.result);
   })
 }

我知道有些代码并不完全是我需要的,但我只是从网上复制的,当我超过这个障碍时会编辑。

【问题讨论】:

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


【解决方案1】:

尝试返回正确的IActionResult 结果。

[HttpPost]
public IActionResult OnPostGeoLocation() {
    // Just to test that it actually gets called
    Console.WriteLine("OnPostGeoLocation CALLED ####################################");

    return new JsonResult("OnPostGeoLocation CALLED ####################################");
}

接下来在进行调用时,您需要调用正确的处理程序路径并包含防伪令牌,因为 Razor 页面旨在自动保护免受跨站点请求伪造 (CSRF/XSRF) 攻击。

更新的 Ajax 调用

function updateRow(recordID, latLng) {
    console.log("REC_ID: " + recordID);
    console.log("LatLng: " + latLng);
    $.ajax({
        type: "POST",
        url: '/Index?handler=GeoLocation', 
        beforeSend: function (xhr) {
            xhr.setRequestHeader("XSRF-TOKEN",
                $('input:hidden[name="__RequestVerificationToken"]').val());
        },
        contentType: "application/json; charset=utf-8",
        dataType: "json"
    }).done(function (data) {
        console.log(data.result);
    })
}

非常有用的参考文章

Handle Ajax Requests in ASP.NET Core Razor Pages

【讨论】:

  • 哦,是的,这只是一个错字。它显示了图片中的 OnPostGeoLocation。当我改变?斜杠(/)我得到一个 404 not found 错误而不是 no VerficationToken 错误。如果我仍然无法弄清楚,我会查看你们提供的链接并返回。谢谢!
【解决方案2】:

在仔细阅读Handle Ajax Requests in ASP.NET Core Razor Pages 之后,我发现我确实误解了一些原则,您可以使用@Html.AntiForgeryToken() 明确添加AntiForgeryToken 而没有“form”标签

我的代码现在看起来像这样:

还有:

【讨论】:

  • 在发送前您不需要使用的一件事在调用中有headers 对象。这也可以全局配置,因此您不需要为每个 ajax 设置它。
  • 你是对的,我在与处理程序的回答中也犯了一个错误。修复。
猜你喜欢
  • 2021-05-29
  • 1970-01-01
  • 2019-10-12
  • 1970-01-01
  • 2018-03-30
  • 2021-09-25
  • 2019-07-05
  • 2020-05-08
  • 1970-01-01
相关资源
最近更新 更多