ASP.NET Core WebAPI 模型验证 验证特性自定义返回

通过引用系统类库System.ComponentModel.DataAnnotations,实现模型的数据校验。

更多模型验证属性官方说明:https://docs.microsoft.com/zh-cn/dotnet/api/system.componentmodel.dataannotations?view=net-5.0

复制代码
public class DemoModel
    {
        /// <summary>
        /// 主键
        /// </summary>
        public string Id { get; set; }

        /// <summary>
        /// 姓名
        /// </summary>
        [Required(ErrorMessage = "姓名不能为空")]
        [StringLength(50, ErrorMessage = "姓名限制50个字符")]
        public string Name { get; set; }

        /// <summary>
        /// 年龄
        /// </summary>
        [Required(ErrorMessage = "年龄不能为空")]
        [Range(10, 80,ErrorMessage = "年龄字段限制范围 {1} - {2}")]
        public string Age { get; set; }

        /// <summary>
        /// 性别
        /// </summary>
        [Required(ErrorMessage = "性别不能为空")]
        public string Gender { get; set; }
    }
复制代码

Demo控制器接口:

复制代码
/// <summary>
/// 保存Demo数据
/// </summary>
[HttpPost]
[Route("save"), MapToApiVersion("1.0")]
public async Task<IActionResult> SaveDemo_V1_0([FromBody] DemoModel model)
{
    var result = await _mediator.Send(new SaveDemoCommand(model));
    result.apiVersion = HttpContext.GetRequestedApiVersion().ToString();//获取API版本号
    return Ok(result);
}
复制代码

 

postman调用请求:

 此时发现返回的数据格式需要调整为自定义的统一格式,需要在Startup文件中做修改:

复制代码
     // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
            //模型绑定 特性验证,自定义返回格式
            services.Configure<ApiBehaviorOptions>(options =>
            {
                options.InvalidModelStateResponseFactory = actionContext =>
                {
                    //获取验证失败的模型字段 
                    var errors = actionContext.ModelState
                    .Where(e => e.Value.Errors.Count > 0)
                    .Select(e => e.Value.Errors.First().ErrorMessage)
                    .ToList();
                    var strErrorMsg = string.Join("|", errors);
                    //设置返回内容
                    var result = new CommandResult<string>
                    {
                        success = false,
                        message = strErrorMsg
                    };
                    return new BadRequestObjectResult(result);
                };
            });
        }
复制代码

CommandResult类:

复制代码
public class CommandResult<T>
    {
        public CommandResult();

        public bool success { get; set; }
        public string message { get; set; }
        public string errCode { get; set; }
        public int resCode { get; set; }
        public string apiVersion { get; set; }
        public int timestamp { get; set; }
        public T data { get; set; }
    }
复制代码

调整好消息返回格式后再次postman调用:

 此时发现返回的消息已经变成自定义的格式,问题得到解决。

参考文章:https://blog.csdn.net/joe96/article/details/93539675

 

posted @   Jackie Hao  阅读(1154)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示