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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 02:22:27