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

如何在ASP.NET C#中开发接收含数组JSON数据的Post方法Web API

ASP.NET C# Web API Post方法实现:存储作业卡数据到数据库

1. 创建对应的数据模型类

定义与JSON结构匹配的实体类,通过JsonPropertyName特性确保JSON字段与C#属性正确映射,同时配置数据库主键与关联关系:

using System.Text.Json.Serialization;
using System.ComponentModel.DataAnnotations;

public class JobCard
{
    [Key]
    [JsonPropertyName("jobcardID")]
    public string JobcardID { get; set; }
    
    [JsonPropertyName("breakdownID")]
    public string BreakdownID { get; set; }
    
    [JsonPropertyName("vehicleNumber")]
    public string VehicleNumber { get; set; }
    
    [JsonPropertyName("ODOmeter")]
    public long ODOmeter { get; set; }
    
    [JsonPropertyName("spareparts")]
    public List<SparePart> Spareparts { get; set; } = new List<SparePart>();
    
    [JsonPropertyName("totalSpareCost")]
    public decimal TotalSpareCost { get; set; }
    
    [JsonPropertyName("totalLabourTime")]
    public string TotalLabourTime { get; set; }
    
    [JsonPropertyName("totalLabourCost")]
    public decimal TotalLabourCost { get; set; }
    
    [JsonPropertyName("TotalCost")]
    public decimal TotalCost { get; set; }
    
    [JsonPropertyName("vehicleRecoveryTime")]
    public DateTime VehicleRecoveryTime { get; set; }
}

public class SparePart
{
    [Key]
    [JsonPropertyName("spItemCode")]
    public int SpItemCode { get; set; }
    
    [JsonPropertyName("spitemName")]
    public string SpitemName { get; set; }
    
    [JsonPropertyName("spitemCost")]
    public decimal SpitemCost { get; set; }
    
    [JsonPropertyName("spitemManhours")]
    public int SpitemManhours { get; set; }
    
    [JsonPropertyName("spitemEstStartDTM")]
    public DateTime SpitemEstStartDTM { get; set; }
    
    [JsonPropertyName("spitemEstEndDTM")]
    public DateTime SpitemEstEndDTM { get; set; }

    // 外键关联JobCard主表
    public string JobcardID { get; set; }
    public JobCard JobCard { get; set; }
}

2. 配置Entity Framework Core DbContext

创建DbContext类,定义数据库集并配置一对多的实体关系:

using Microsoft.EntityFrameworkCore;

public class AppDbContext : DbContext
{
    public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
    {
    }

    public DbSet<JobCard> JobCards { get; set; }
    public DbSet<SparePart> SpareParts { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        // 配置JobCard与SparePart的一对多关联
        modelBuilder.Entity<JobCard>()
            .HasMany(j => j.Spareparts)
            .WithOne(s => s.JobCard)
            .HasForeignKey(s => s.JobcardID)
            .OnDelete(DeleteBehavior.Cascade);
    }
}

3. 编写API控制器的Post方法

创建API控制器,注入DbContext实现数据存储逻辑,包含模型验证、异常处理与返回结果:

using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;

[Route("api/[controller]")]
[ApiController]
public class JobCardsController : ControllerBase
{
    private readonly AppDbContext _context;

    public JobCardsController(AppDbContext context)
    {
        _context = context;
    }

    // POST: api/JobCards
    [HttpPost]
    public async Task<ActionResult<JobCard>> PostJobCard(JobCard jobCard)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        try
        {
            _context.JobCards.Add(jobCard);
            await _context.SaveChangesAsync();

            return CreatedAtAction(nameof(GetJobCard), new { id = jobCard.JobcardID }, jobCard);
        }
        catch (DbUpdateException ex)
        {
            if (JobCardExists(jobCard.JobcardID))
            {
                return Conflict("作业卡ID已存在");
            }
            else
            {
                return StatusCode(StatusCodes.Status500InternalServerError, "数据存储失败:" + ex.InnerException?.Message);
            }
        }
    }

    // 辅助方法:检查作业卡是否存在
    private bool JobCardExists(string id)
    {
        return _context.JobCards.Any(e => e.JobcardID == id);
    }

    // 可选:添加Get方法用于验证存储结果
    [HttpGet("{id}")]
    public async Task<ActionResult<JobCard>> GetJobCard(string id)
    {
        var jobCard = await _context.JobCards.Include(j => j.Spareparts)
            .FirstOrDefaultAsync(j => j.JobcardID == id);

        if (jobCard == null)
        {
            return NotFound();
        }

        return jobCard;
    }
}

4. 关键配置与注意事项

  • 数据库连接配置:在appsettings.json中添加连接字符串:
    "ConnectionStrings": {
      "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=JobCardDb;Trusted_Connection=True;MultipleActiveResultSets=true"
    }
    
    并在Program.cs中注册DbContext:
    builder.Services.AddDbContext<AppDbContext>(options =>
        options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
    
  • 模型验证:[ApiController]特性会自动触发模型验证,可在实体类属性上添加[Required]、[MaxLength]等特性增强数据合法性检查。
  • 事务保障:EF Core默认在SaveChangesAsync时开启事务,确保主表与子表数据同时提交或回滚。
  • 数据类型适配:将JSON中的字符串类型成本、工时转换为C#的decimal/int类型,保证数据库存储精度。

内容的提问来源于stack exchange,提问作者srinivasarao jella

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 09:48:29