从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
相关产品推荐
相关产品推荐

