.NET Core使用Ajax调用带参数OnGet方法传参失败解决
问题根因
参数接收失败是三个常见错误叠加导致的:
- Handler方法名和路由不匹配:Razor Pages中如果访问路径带
Refund段/指定handler为Refund,对应方法名必须是OnGetRefund,默认无后缀的OnGet只能匹配不带handler参数的页面根路径GET请求。 - GET请求配置错误:GET请求没有请求体,第一种写法加了
contentType: "application/json"配置、第二种写法用JSON.stringify包裹参数,都是给带请求体的POST/PUT请求用的写法,会导致参数无法被正确解析到URL查询串中。 - 手动拼接URL容易出错:手动拼接查询串时如果参数包含特殊字符(比如&、空格、中文),会直接截断参数,导致绑定失败。
修复方案
1. 修正后端方法
如果要匹配Refund这个Handler,把方法名改成符合Razor Pages约定的命名即可,参数不需要额外加绑定特性:
// 对应handler=Refund的GET请求 public void OnGetRefund(string id, string refundReason, int amount) { // 你的业务逻辑 }
如果你不想用命名Handler,就保留OnGet方法名,后续Ajax的URL里去掉Refund相关的路径/参数即可。
2. 修正Ajax写法
直接用jQuery自动拼接查询参数的能力,不要手动拼URL、不要加JSON序列化、不要给GET请求设置JSON的contentType:
$.ajax({ // 用相对路径更通用,不要写死localhost端口,?handler=Refund对应OnGetRefund方法 url: "/Transactions?handler=Refund", type: "GET", // 直接传对象,jQuery会自动编码拼接成查询串 data: { id: '20a63762-a6ab-4edb-852b-fd247e9dc247', refundReason: refundReason, amount: amount }, dataType: "json", success: function (data) { // 处理返回结果 } });
额外注意事项
- 确保传入的
amount值可以被转成整数,传非数字字符串会导致int类型参数绑定失败。 - 不要给GET请求的参数加
[FromBody]特性,.NET Core默认不会从GET请求的请求体中读取数据做绑定。 - 如果你的项目自定义了Razor Pages路由让Handler出现在路径段(比如/Transactions/Refund的形式),确认路由模板中已经预留了handler的位置,否则统一用
?handler=xxx的查询串写法兼容性最好。
内容的提问来源于stack exchange,提问作者Vasanth R
相关产品推荐
相关产品推荐

