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

从React客户端传参至ASP.NET Core触发SqlException,Swagger调用正常

问题原因解析

1. 参数名称不匹配

React客户端发送的JSON字段是us1、us2,但后端控制器方法的参数是user1、user2——两者名称完全不对应,ASP.NET Core无法自动完成映射,导致后端接收的user1和user2始终为null。

2. 缺少JSON绑定标识

你的控制器方法参数没有添加[FromBody]特性:

  • Swagger默认用表单/查询参数传递值,ASP.NET Core可以自动绑定;
  • 但React发送的是JSON格式的请求体,必须通过[FromBody]明确告诉框架从请求体中读取参数,否则框架会默认从查询字符串或表单数据中查找,自然找不到对应参数。

当user1和user2为null时,AddWithValue会将null传递给存储过程的@user1_res和@user2_res参数。如果你的存储过程设置这两个参数为必填(无默认值),SQL Server就会抛出「未提供参数」的错误。

修复方案

步骤1:对齐前后端参数名称

修改React代码,将发送的JSON字段名改为和后端一致:

let data= {
    user1: gameResult.us1Win,
    user2: gameResult.us2Win,
};

步骤2:添加[FromBody]并使用模型绑定

建议创建一个模型类来接收JSON参数,同时添加[FromBody]特性:

// 新增模型类,用于绑定JSON请求体
public class GameResultRequest
{
    public byte? User1 { get; set; }
    public byte? User2 { get; set; }
}

// 修改控制器方法
[HttpPost]
[Route("SetGameResults")]
public string SetGameResults([FromBody] GameResultRequest request)
{
    // 先校验请求是否有效(限制参数只能是0或1)
    if (request == null || request.User1 is not (0 or 1) || request.User2 is not (0 or 1))
    {
        return "Invalid data";
    }

    DataTable table = new DataTable();
    string sqlDataSource = _configuration.GetConnectionString("tictaktoedb1");
    
    try
    {
        using (SqlConnection myCon = new SqlConnection(sqlDataSource))
        {
            myCon.Open();

            using (SqlCommand myCommand = new SqlCommand("Set_Game_Result", myCon))
            {
                myCommand.CommandType = CommandType.StoredProcedure;
                myCommand.Parameters.AddWithValue("@user1_res", request.User1);
                myCommand.Parameters.AddWithValue("@user2_res", request.User2);

                using (SqlDataReader myReader = myCommand.ExecuteReader())
                {
                    table.Load(myReader);
                }

                return table.Rows.Count > 0 
                    ? JsonConvert.SerializeObject(table) 
                    : "No data returned";
            }
        }
    }
    catch (SqlException ex)
    {
        return $"Inner Exception: {ex.Message}";
    }
    catch (Exception ex)
    {
        return $"Outer Exception: {ex.Message}";
    }
}

补充说明

原代码中的条件!(user1 >= 1 && user2 >= 1)存在逻辑问题——如果参数值允许为0,这个条件会把0的情况判定为「有效」,但如果你的业务要求参数只能是0或1,建议直接校验值范围,避免传入无效值。

内容的提问来源于stack exchange,提问作者Elassoa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 08:05:21