ASP.NET MVC控制器无法接收AJAX GET请求传递的projectId数据
问题分析与解决
核心问题原因
- GET请求不支持
[FromBody]:HTTP GET请求不会携带请求体(Request Body),控制器里的[FromBody]属性用于从请求体解析参数,在GET方法中完全无效,这是projectId始终为null的直接原因。 - 无效的
contentType配置:AJAX里设置的contentType: "application/json; charset=utf-8"对GET请求无意义,因为GET参数是通过URL查询字符串传递的,该配置反而可能干扰参数解析。 - 异步返回值问题(附加):当前函数直接
return projectName会返回初始空字符串,因为AJAX是异步操作,success回调还未执行就已返回结果。
解决方案
1. 修正控制器方法
移除[FromBody]属性,且由于projectId是数字类型,建议将参数类型从string改为int(贴合实际数据类型,避免不必要的类型转换):
[HttpGet] public JsonResult GetSubProjName(int projectId) { // 业务逻辑代码 return Json("实际子项目名称"); // 返回处理后的结果 }
2. 修正AJAX请求代码
删除无效的contentType配置,同时解决异步返回值问题(以下提供两种实现方式):
方式一:使用回调函数
function getSubProjName(projectId, callback) { console.log(projectId); $.ajax({ type: 'GET', url: '@Url.Action("GetSubProjName", "Home")', data: { projectId: projectId }, dataType: "json", success: function (response) { console.log(response); callback(response); }, error: function (response) { console.log(response); callback(null); // 错误时返回null或自定义错误信息 } }); } // 调用示例 getSubProjName(123, function(projectName) { if (projectName) { // 获取结果后的业务逻辑 console.log("子项目名称:", projectName); } });
方式二:使用Promise(现代异步处理方式)
function getSubProjName(projectId) { console.log(projectId); return new Promise((resolve, reject) => { $.ajax({ type: 'GET', url: '@Url.Action("GetSubProjName", "Home")', data: { projectId: projectId }, dataType: "json", success: function (response) { console.log(response); resolve(response); }, error: function (response) { console.log(response); reject(response); } }); }); } // 调用示例 getSubProjName(123) .then(projectName => { console.log("子项目名称:", projectName); }) .catch(error => { console.error("请求失败:", error); });
内容的提问来源于stack exchange,提问作者Blue Hues
相关产品推荐
相关产品推荐

