You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core Razor Pages中Ajax调用C#方法的实现难题

嘿,刚接触Razor Pages遇到这种问题太正常了,毕竟它和WebForms的玩法差别不小~我来帮你一步步解决AJAX调用后台Post方法的问题:

解决Razor Pages中AJAX调用后台Post方法的问题

1. 先搞懂Razor Pages的POST逻辑

Razor Pages不用WebForms那套WebMethod,它是基于页面模型的,你写的OnPostGeoLocation命名格式是对的(OnPost[自定义动作名]),但有个关键:Razor Pages默认强制验证防伪造令牌,不管请求是不是从表单触发,所以你的AJAX请求必须带上这个令牌才能通过验证。

2. 调整后台方法(可选但更实用)

你的测试方法可以稍微改一下,方便后续返回数据,当然保留纯测试逻辑也没问题:

public IActionResult OnPostGeoLocation()
{
    Console.WriteLine("OnPostGeoLocation CALLED ####################################");
    // 后续需要返回数据的话,用JsonResult更方便
    return new JsonResult(new { success = true, message = "方法已成功调用" });
}

3. 搞定防伪造令牌的传递

你需要先在页面里生成令牌,再在AJAX请求里带上它:

  • 第一步,在Index.cshtml页面任意位置添加生成令牌的代码:
@Html.AntiForgeryToken()
  • 第二步,修改你的JavaScript代码,获取令牌并加到请求头里:
function updateRow(recordID, latLng) {
    console.log("REC_ID: " + recordID);
    console.log("LatLng: " + latLng);
    
    // 从页面获取防伪造令牌
    const token = $('input[name="__RequestVerificationToken"]').val();
    
    $.ajax({
        type: "POST",
        url: '/Index', // 注意:Razor Pages不用在URL加?OnPostGeoLocation,直接指向页面即可
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        headers: {
            // 把令牌放到请求头里,这是最规范的方式
            "RequestVerificationToken": token
        },
        // 如果要把recordID和latLng传给后台,这里可以加data字段
        data: JSON.stringify({
            recordID: recordID,
            latLng: latLng
        })
    }).done(function (data) {
        console.log(data);
    }).fail(function(xhr, status, error) {
        console.error("请求失败:", error);
    });
}

4. 几个关键细节要注意

  • URL写法:Razor Pages会根据POST请求自动匹配OnPost开头的方法,所以不用在URL里加?OnPostGeoLocation,直接写页面路径/Index就行。
  • 参数传递:如果要把前端的recordID和latLng传到后台,只需要在后台方法里加对应参数,框架会自动绑定:
public IActionResult OnPostGeoLocation(string recordID, string latLng)
{
    Console.WriteLine($"REC_ID: {recordID}, LatLng: {latLng}");
    Console.WriteLine("OnPostGeoLocation CALLED ####################################");
    return new JsonResult(new { success = true });
}
  • 令牌的其他传递方式:要是不想用请求头,也可以把令牌放到data里一起传,只要参数名是__RequestVerificationToken就行。

这样调整后,你的AJAX请求应该就能成功触发后台的OnPostGeoLocation方法了~

内容的提问来源于stack exchange,提问作者Nikolaj Herting Olsen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:58:33