ASP.NET Core API接收不定数量参数的调用问题
解决ASP.NET Core API处理不定数量参数的问题
首先,你当前遇到的核心问题是前后端数据类型不匹配:前端发送的是包含不确定数量键值对的对象(还额外包裹了一层数组),但后端用string[][](二维字符串数组)接收,ASP.NET Core的模型绑定无法完成这种结构的解析,导致请求失败。
下面给你几个实用的解决方案,按推荐度排序:
方案1:使用Dictionary<string, string>接收(最推荐)
你的参数是典型的「不确定数量的键值对」结构,Dictionary<string, string>完美适配这种场景——既保证类型安全,处理逻辑也简洁直观。
后端API代码修改:
[Produces("application/json")] [Route("api/Default/")] public class DefaultController : Controller { [HttpPost] public IActionResult Apc([FromBody] Dictionary<string, string> answers) { // 遍历处理所有问答对 foreach (var kvp in answers) { var questionKey = kvp.Key; // 比如"Question1" var answerValue = kvp.Value; // 比如"Answer1" // 这里编写你的业务逻辑 } return Json(new { success = true, message = "参数处理完成" }); } }
前端代码优化(可选)
你当前的代码把对象包裹在了数组里,如果只是传递一组问答对,直接传对象更简洁:
$(function () { $('#btn').click(function () { var src = { "Question1": "Answer1", "Question2": "Answer2", "Question3": "Answer3" // 可按需继续添加更多QuestionN:AnswerN键值对 }; $.ajax({ url: 'api/Default/', method: 'POST', dataType: 'JSON', data: JSON.stringify(src), contentType: "application/json", success: function (d) { alert("Success: " + d.message); }, error: function (e) { alert("Error please try again"); } }); }) })
如果确实需要传递多组问答(比如批量提交),后端只需改成[FromBody] List<Dictionary<string, string>>即可。
方案2:使用dynamic类型接收(快速但类型不安全)
如果不想定义具体类型,可以用dynamic快速接收,但缺点是没有编译时类型检查,容易因参数结构变化引发错误:
[HttpPost] public IActionResult Apc([FromBody] dynamic answers) { // 通过反射遍历所有属性 foreach (var prop in answers.GetType().GetProperties()) { var questionKey = prop.Name; var answerValue = prop.GetValue(answers, null)?.ToString(); // 业务逻辑处理 } return Json(new { success = true }); }
额外注意事项
- 必须给后端参数添加
[FromBody]特性,明确告诉ASP.NET Core从请求体中解析JSON数据。 - 前端一定要设置
contentType: "application/json",否则后端无法正确识别请求体的格式。 - 当参数数量为0时,字典会是空集合,后端可以正常处理,无需额外判断。
内容的提问来源于stack exchange,提问作者Tanwer
相关产品推荐
相关产品推荐

