.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
相关产品推荐
相关产品推荐

