.Net Core Web Api POST请求如何省略Id属性不触发验证错误
解决方案
问题原因
验证错误触发原因是ASP.NET Core的默认模型验证规则导致:int属于不可空值类型,.NET Core 3.0及以上版本会默认将所有不可空值类型隐式标记为必填项。POST请求不传Id字段时,模型绑定没有为该字段赋值,就会触发验证失败;传Id: 0刚好匹配了int类型的默认值,所以可以通过验证。
该需求完全可以实现,以下是几种可行的方案,按推荐优先级排序:
方案1:在模型属性上标记绑定忽略(最推荐)
直接标记Id字段不参与请求绑定,同时显式标注主键和自增属性,既可以避免请求不传Id时报错,还能防止恶意传入的Id值被绑定到模型,安全性最高。
修改后的模型代码如下:
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.AspNetCore.Mvc.ModelBinding; public class Playback { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] [BindNever] // FromForm绑定场景用该特性忽略字段,如果是FromBody的Json请求可替换为[JsonIgnore] public int Id { get; set; } [Required] public string Video_Name { get; set; } [Required] public string Video_Duration { get; set; } public string Playback_User { get; set; } public int Playback_Duration { get; set; } }
方案2:给Id设置默认值
给Id属性设置默认值为0,请求不传该字段时也会有有效值通过验证,修改简单但无法拦截恶意传入的非0Id:
public int Id { get; set; } = 0;
方案3:全局关闭值类型隐式必填验证
如果项目所有接口都有类似需求,不需要将值类型默认为必填项,可以全局修改配置,在Startup.cs的ConfigureServices方法中添加以下配置:
services.AddControllers(options => { // 禁用不可空值类型的隐式必填验证规则 options.SuppressImplicitRequiredAttributeForNonNullableValueTypes = true; });
注意:该配置会全局生效,后续所有值类型的字段都需要手动加
[Required]特性才会触发必填验证。
额外优化建议
当前控制器的写法可以简化,不需要重新new Playback对象赋值,直接将传入的model交给EF Core添加即可,Id已经做了忽略/默认值处理,EF Core会自动识别自增主键:
public async Task<IActionResult> AddPlaybackEvent2([FromForm] Playback model) { try { _db.Playbacks.Add(model); await _db.SaveChangesAsync(); // 建议用异步方法匹配控制器的async修饰 } catch (Exception e) { return BadRequest(e.Message); } return Ok(model); }
内容的提问来源于stack exchange,提问作者Raf
相关产品推荐
相关产品推荐

