.NET核心Razor页面对C#方法的Ajax调用

.NET核心Razor页面对C#方法的Ajax调用,c#,ajax,asp.net-core,razor-pages,C#,Ajax,Asp.net Core,Razor Pages,我目前正在制作一个在谷歌地图上显示位置的网站。我从Airtable.com数据库中获得了位置地址,那里的一切都很正常。然而,由于谷歌只允许对地理编码地址进行一定数量的请求,我希望将坐标保存在同一个数据库中,因此我只在需要查找新位置(地址)时使用地理编码api。我得到了所有的设置,但我似乎不知道如何在razor页面中从js调用cs方法。我在过去使用过WebMethod,但显然我不能在这里使用它 当我尝试使用我在网上找到的示例时,它说我需要RequestVerificationToken,但这需要调

我目前正在制作一个在谷歌地图上显示位置的网站。我从Airtable.com数据库中获得了位置地址,那里的一切都很正常。然而,由于谷歌只允许对地理编码地址进行一定数量的请求,我希望将坐标保存在同一个数据库中,因此我只在需要查找新位置(地址)时使用地理编码api。我得到了所有的设置,但我似乎不知道如何在razor页面中从js调用cs方法。我在过去使用过WebMethod,但显然我不能在这里使用它

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

这是我第一次使用剃须刀页面,所以如果我完全误解了什么,请容忍我

我想调用的cs方法的图片(Index.cshtml.cs)

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


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

尝试返回一个正确的
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);
    })
}
非常有用的文章供参考

仔细阅读后,我发现我确实误解了其中的一些原则,可以使用@Html.AntiForgeryToken()显式添加AntiForgeryToken,而无需“form”标记

我的代码现在是这样的:

以及:


在页面中显示更多页面模型。我还建议您参考我能告诉您的内容,您在依赖配置方面有问题,我认为您需要在ajax调用中添加标题哦,是的,这只是一个输入错误。它在图片中显示了OnPostGeoLocation。我什么时候换衣服?对于斜杠(/),我得到一个404NotFound错误,而不是no VerficationToken错误。我会调查你们两人提供的链接,如果我还没弄明白,我会回来的。谢谢只有一件事在发送之前不需要使用,那就是调用中有
标题
对象。此外,它可以全局配置,所以您不需要为每个人都配置它。您是正确的,我在回答处理程序时也犯了一个错误。修理。
[HttpPost]
public IActionResult OnPostGeoLocation() {
    // Just to test that it actually gets called
    Console.WriteLine("OnPostGeoLocation CALLED ####################################");

    return new JsonResult("OnPostGeoLocation CALLED ####################################");
}
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);
    })
}