You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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接收参数

这是最规范、易维护的做法,步骤如下:

  1. 定义ViewModel类
    创建一个对应请求参数的实体类,放在项目的Models文件夹下:

    public class MenuHighlightRequest
    {
        public string CurrentPage { get; set; }
        public bool IsBookMark { get; set; }
    }
    
  2. 修改控制器Action
    用这个ViewModel类作为参数,只添加一个[FromBody]特性:

    [HttpPost]
    public IActionResult HighlightCurrentMenu([FromBody] MenuHighlightRequest request)
    {
        // 直接使用 request.CurrentPage 和 request.IsBookMark 即可
        // 你的业务逻辑代码...
        return Json(true);
    }
    
  3. 调整前端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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 08:12:40