如何在C#中编写POST接口接收前端对象并保存至数据库
实现C# POST接口接收前端答题数组并保存到数据库
1. 定义接收前端数据的DTO
由于前端传递的答题数据不包含自增的erId字段,建议单独定义数据传输对象(DTO)接收请求,避免直接操作数据库实体:
public class AnswerDto { public int QueId { get; set; } public int AnsId { get; set; } public int Score { get; set; } }
2. 编写控制器中的POST方法
假设你的数据库上下文类为AppDbContext,数据库实体类为ExamResult(对应包含erId、queId、ansId、score的表),控制器实现如下:
[ApiController] [Route("api/[controller]")] public class AnswersController : ControllerBase { private readonly AppDbContext _dbContext; // 通过构造函数注入数据库上下文 public AnswersController(AppDbContext dbContext) { _dbContext = dbContext; } [HttpPost] public async Task<IActionResult> SubmitAnswers([FromBody] List<AnswerDto> answers) { // 验证输入合法性 if (!ModelState.IsValid || answers == null || answers.Count == 0) { return BadRequest("无效的答题数据"); } // 将DTO转换为数据库实体 var examResults = answers.Select(dto => new ExamResult { QueId = dto.QueId, AnsId = dto.AnsId, Score = dto.Score // 自增字段erId无需手动赋值,EF Core会自动生成 }).ToList(); try { // 批量添加实体到上下文 _dbContext.ExamResults.AddRange(examResults); // 异步保存到数据库 await _dbContext.SaveChangesAsync(); return Ok(new { 提示 = "答题数据保存成功", 条数 = examResults.Count }); } catch (Exception ex) { return StatusCode(StatusCodes.Status500InternalServerError, $"保存失败:{ex.Message}"); } } }
3. 关键配置说明
- 数据库实体配置:确保
ExamResult中的erId被正确标记为自增主键:
public class ExamResult { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int ErId { get; set; } public int QueId { get; set; } public int AnsId { get; set; } public int Score { get; set; } }
- 上下文依赖注入:在
Program.cs中已完成数据库上下文的注册:
builder.Services.AddDbContext<AppDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
前端请求参考(可选)
前端使用axios发送请求的示例:
const answers = [ { queId: 2, ansId: 1, score: 3 }, { queId: 3, ansId: 2, score: 2 }, { queId: 4, ansId: 3, score: 1 } ]; axios.post('/api/answers', answers) .then(res => console.log(res.data)) .catch(err => console.error(err));
内容的提问来源于stack exchange,提问作者YRandeeka
相关产品推荐
相关产品推荐

