ASP.NET Core Razor:AJAX请求如何同时传递QueryString与FromBody参数
解决Razor Pages中AJAX POST同时传递[FromQuery]和[FromBody]参数的问题
第一步:修正后台代码的语法错误
你的后台方法签名存在多余的语法冗余,会导致编译失败,需删除无效的[FromQuery],片段:
public class MyNamespaceModel : PageModel { public async Task<IActionResult> OnPostDisplay([FromQuery] string param1, [FromQuery] string param2, [FromBody] ClientData ClientRequestData) { // 使用param1、param2和ClientRequestData.param3执行操作 return Page(); } } public class ClientRequestData { public string param3 {get;set;}}
第二步:构造正确的AJAX请求URL
你之前的URL构造错误在于出现了两个?分隔符,导致后台无法正确解析查询参数。正确的做法是将handler=Display与原有查询参数用&拼接在同一查询字符串中。
修正后的JS代码:
var input_json = {}; input_json['param3'] = "carpe diem"; let searchParams = new URLSearchParams(window.location.search); var _url = null; if (searchParams.has('param1') && searchParams.has('param2')) { // 将handler参数加入现有查询参数集合 searchParams.set('handler', 'Display'); // 生成符合规范的查询字符串 _url = '?' + searchParams.toString(); } console.log(_url); // 输出示例: ?param1=Hello¶m2=World&handler=Display $.ajax({ type: 'POST', url: _url, data: JSON.stringify(input_json), contentType: 'application/json', dataType: "json", beforeSend: function (xhr) { xhr.setRequestHeader("XSRF-TOKEN", $('input:hidden[name="__RequestVerificationToken"]').val()); }, success: function (response) { console.log(response); // response已为JSON对象,无需重复序列化 }, error: function (error) { console.log("Error: " + error); } });
关键说明:
- URL格式规范:HTTP查询字符串仅允许一个起始符
?,后续参数统一用&分隔。使用URLSearchParams.toString()方法可自动完成参数拼接与编码,避免手动拼接的格式错误。 - [FromBody]参数传递:你的AJAX代码中设置
contentType: 'application/json'并序列化数据发送,完全符合[FromBody]的接收要求,无需调整。 - XSRF令牌验证:Razor Pages的POST请求必须携带XSRF令牌,你的代码已正确实现该逻辑,保持即可。
内容的提问来源于stack exchange,提问作者SoftwareDveloper
相关产品推荐
相关产品推荐

