ASP Web API实现Score对象批量提交的技术方案求助
批量提交技能分数的解决方案
问题背景
现有Web API仅支持单次提交单个Score对象,无法满足批量提交多条工程师技能分数记录的需求,需修改接口与调用代码实现批量提交功能。
1. 修改Web API的批量提交接口
将接口参数改为接收List<Score>集合,同时调整数据插入逻辑为批量操作:
[HttpPost("batch")] // 新增独立路由,避免与原有单条提交接口冲突 public async Task<ActionResult<IEnumerable<Score>>> PostScores(List<Score> scores) { if (scores == null || !scores.Any()) { return BadRequest("提交的分数列表不能为空"); } _context.Scores.AddRange(scores); await _context.SaveChangesAsync(); return CreatedAtAction("GetScores", scores); }
说明:使用
AddRange替代Add实现批量插入,比循环单条插入效率更高;保留原有单条提交接口的兼容性,不影响原有业务逻辑。
2. 调整UI端的批量调用代码
修改NewSubmission方法,改为接收分数列表并调用批量接口:
public ActionResult NewSubmission(List<ScoreModel> newScoreSubmissions) { if (newScoreSubmissions == null || !newScoreSubmissions.Any()) { ModelState.AddModelError(string.Empty, "请至少提交一条分数记录"); return View(newScoreSubmissions); } using (var client = new HttpClient()) { client.BaseAddress = new Uri(Baseurl + "/api/Scores/batch"); // 提交分数列表集合 var postTask = client.PostAsJsonAsync<List<ScoreModel>>(client.BaseAddress, newScoreSubmissions); postTask.Wait(); var result = postTask.Result; if (result.IsSuccessStatusCode) { return RedirectToAction("ListScores"); } else { ModelState.AddModelError(string.Empty, "提交失败,请联系技术支持"); } } return View(newScoreSubmissions); }
说明:参数改为
List<ScoreModel>,与API接口的参数类型匹配;增加空列表校验,提前给用户错误提示;完善错误分支的页面反馈逻辑。
3. 关键注意事项
- 确保前端
ScoreModel与后端Score类的属性名称、数据类型完全一致,避免序列化/反序列化失败 - 若需要批量提交的原子性(所有记录要么全部成功,要么全部回滚),可添加事务处理:
using (var transaction = await _context.Database.BeginTransactionAsync()) { try { _context.Scores.AddRange(scores); await _context.SaveChangesAsync(); await transaction.CommitAsync(); } catch { await transaction.RollbackAsync(); throw; } }
内容的提问来源于stack exchange,提问作者Chris Smith
相关产品推荐
相关产品推荐

