ASP.NET Core 3.1中jQuery Ajax传递参数始终为null的问题
解决ASP.NET Core 3.1中Ajax传参控制器接收为null的问题
问题原因分析
你遇到的核心问题是ASP.NET Core的[FromBody]特性限制:请求体是单次读取的数据流,一个Action方法只能有一个标记了[FromBody]的参数。你之前给两个参数都加了[FromBody],导致模型绑定器无法正确解析请求内容,所以参数会返回null。
另外,你尝试的JSON.stringify("{'CurrentPage':'" + CurrentPage + "', 'IsBookMark':'" + IsBookMark + "'}")写法,本质是把一个JSON格式的字符串再次序列化,所以控制器接收到的是完整的字符串内容,而不是解析后的参数值。
推荐解决方案:使用强类型ViewModel接收参数
这是最规范、易维护的做法,步骤如下:
定义ViewModel类
创建一个对应请求参数的实体类,放在项目的Models文件夹下:public class MenuHighlightRequest { public string CurrentPage { get; set; } public bool IsBookMark { get; set; } }修改控制器Action
用这个ViewModel类作为参数,只添加一个[FromBody]特性:[HttpPost] public IActionResult HighlightCurrentMenu([FromBody] MenuHighlightRequest request) { // 直接使用 request.CurrentPage 和 request.IsBookMark 即可 // 你的业务逻辑代码... return Json(true); }调整前端Ajax代码
保持你之前正确的对象序列化写法,另外注意:ASP.NET Core返回的JSON结果不会像旧MVC那样包装在d属性里,所以success回调里直接使用data即可:function SetCurrentPageNameSession(CurrentPage, IsBookMark) { // 处理IsBookMark未传参的情况,和原逻辑保持一致 if (IsBookMark === undefined) IsBookMark = false; var url = baseUrl + "Manage/HighlightCurrentMenu/" $.ajax({ type: "POST", data: JSON.stringify({ CurrentPage: CurrentPage, IsBookMark: IsBookMark }), url: url, contentType: "application/json; charset=utf-8", dataType: "json", async: false, success: function (data) { // 移除原来的data.d,直接用data var res = data; }, error: function (xhr, ajaxOptions, thrownError) { } }); }
备选方案:使用JObject接收(无需创建实体类)
如果不想额外创建ViewModel类,可以借助Newtonsoft.Json的JObject来解析请求体(需要确保项目已引用Newtonsoft.Json NuGet包):
using Newtonsoft.Json.Linq; [HttpPost] public IActionResult HighlightCurrentMenu([FromBody] JObject requestData) { string currentPage = requestData["CurrentPage"].ToString(); bool isBookMark = requestData["IsBookMark"].ToObject<bool>(); // 业务逻辑代码... return Json(true); }
前端的Ajax代码和推荐方案中的写法完全一致。
内容的提问来源于stack exchange,提问作者V.Prasad
相关产品推荐
相关产品推荐

