.Net Core 使用模型验证

  • 再开发过程中免不了要去验证参数的合法性,模型验证就是帮助我们去验证参数的合法性,我们可以在需要验证的model属性上加上Data Annotations特性后就会自动帮我们在action前去验证输入数据的合法性。
  1. 定义一个Person类

    public class PersonDto
    {
       public string Name { get; set; }
    
       public string Phone { get; set; }
    
       public int Age { get; set; }
    }

    Person类有三个属性,姓名,电话,年纪。

  2. 创建一个接口并以Person作为input参数并且返回input对象

    public PersonDto Demo(PersonDto input)
    {
        var str = string.Empty;
        PersonDto dto = new PersonDto
        {
          Name = input.Name,
          Age=input.Age,
          Phone=input.Phone,
         };
       return dto;
     }

  3.用postman来调用这个接口  

    

很明显我传入的参数是不合法的,但是接口依旧执行了。 那怎么去验证参数的合法性呢?在接口里面写if吗?这时候模型验证就发挥作用啦。

  1. 修改之前的Person类,引入using System.ComponentModel.DataAnnotations;

    public class PersonDto
        {
            [Required(ErrorMessage = "姓名不能为空"), MaxLength(10, ErrorMessage = "名字太长啦"), MinLength(0, ErrorMessage = "名字太短")]
           [ RegularExpression(@"^[\u4e00-\u9fa5]+$", ErrorMessage = "姓名必须是中文")]
            public string Name { get; set; }
    
            [Required(ErrorMessage = "手机号码不能为空"), RegularExpression(@"^\+?\d{0,4}?[1][3-8]\d{9}$", ErrorMessage = "手机号码格式错误")]
            public string Phone { get; set; }
    
            [Range(1, 1000, ErrorMessage = "年纪必须在0-99之间")]
            public int Age { get; set; }
        }

    在次调用这个接口

    

   如果参数参数的不合法会直接400且会根据定义的提示去提示前端参数哪里不合法。但是很多小伙伴的返回值都是通用的,怎么把这些提示放到自己的通用返回值里面呢?

  1. 定义一个通用的返回值

        public class ResponseDto
        {/// <summary>
            /// 详细错误信息
            /// </summary>
            public string message { get; set; }
    
            /// <summary>
            /// 具体业务参数
            /// </summary>
            public object data { get; set; }
        }
  2. 定义一个CustomResultFilter

        public class CustomResultFilter : ActionFilterAttribute
        {
            public override void OnResultExecuting(ResultExecutingContext context)
            {
    
                if (!context.ModelState.IsValid)
                {
                    ResponseDto result = new ResponseDto();
    
                    foreach (var item in context.ModelState.Values)
                    {
                        foreach (var error in item.Errors)
                        {
                            result.message += error.ErrorMessage + ",";
                            result.data = "{}";
                        }
                    }
                    result.message = result.message.TrimEnd(‘,‘);
                    context.Result = new JsonResult(result);
                }
                else
                {
                    var result = context.Result as ObjectResult ?? null;
                    context.Result = new OkObjectResult(new ResponseDto
                    {
                        message = "成功",
                        data = result == null ? "{}" : result.Value
                    });
                    base.OnResultExecuting(context);
    
                }
            }
    
            public override void OnActionExecuting(ActionExecutingContext context)
            {
            }

    使用ModelState.IsValid来判断模型验证是否通过。

  3. 配置过滤器

            public void ConfigureServices(IServiceCollection services)
            {
                services.AddMvc(options =>
                {
                    options.Filters.Add(typeof(CustomResultFilter));
                }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
                services.AddSwaggerGen(options =>
                {
                    options.SwaggerDoc("v1", new Info
                    {
                        Title = " API",
                        Version = "v1",
                        Description = "RESTful API",
                        TermsOfService = " Service",
                        Contact = new Contact { Name = "", Email = "", Url = "" }
                    });
                });
            }
  4. 测试

  

  模型验证通过

  

原文地址:https://www.cnblogs.com/stutlh/p/11934326.html

时间: 2024-10-08 09:04:47

.Net Core 使用模型验证的相关文章

aspnet core 全局模型验证,统一api响应

上手就来 新建一个模型验证过滤器,其中ApiResp是自定义的统一响应类. public class VldFilter:IActionFilter { /// <summary> /// 执行到action时 /// </summary> /// <param name="context"></param> public void OnActionExecuting(ActionExecutingContext context) { i

asp.net core 2.1的全局模型验证统一方案

网上的统一模型验证,有效到asp.net core 2.0 2.1的mvc还可以用 webapi嘛,想想就好,自己琢磨了一顿,才发现这东西应该这样玩 首先吧api上面的特性注释了 //[ApiController] 这个会干扰 然后把ControllerBase改为Controller 这样,你写的模型验证的统一过滤器才生效,缺一不可 如果不信,大可测试一下 原文地址:https://www.cnblogs.com/NCoreCoder/p/10114041.html

从零写一个Asp.net core手脚架(模型验证)

一个asp.net core项目,一定包含了各种的实体,在RESTful api里面,有很多的参数传递,不建立实体则大量的参数需要自定验证正确性,并且Action上面会写的密密麻麻的参数 在asp.net 2.0的时候,就推出了ModelState,顾名思义,这个是模型状态,用于验证实体对象的 如何模型验证 用法是在需要验证的地方打上继承了ValidationAttribute的特性,比如常见的RequiredAttribute,这个是验证对象是否存在 /// <summary> /// Ad

.Net Core Web Api使用模型验证验证参数合法性

原文:.Net Core Web Api使用模型验证验证参数合法性 在接口开发过程中免不了要去验证参数的合法性,模型验证就是帮助我们去验证参数的合法性,我们可以在需要验证的model属性上加上Data Annotations特性后就会自动帮我们在action前去验证输入数据的合法性. 1.定义一个Person类 public class PersonDto { public string Name { get; set; } public string Phone { get; set; } p

.net core 中api 模型验证

AddControllers/AddMvc方法允许添加自定义ActionFilterAttribute进行过滤 文档中这么定义Filter: 可以创建自定义筛选器,用于处理横切关注点. 横切关注点的示例包括错误处理.缓存.配置.授权和日志记录. 筛选器可以避免复制代码. 例如,错误处理异常筛选器可以合并错误处理. 通过不同的接口定义,筛选器同时支持同步和异步实现. 同步筛选器在其管道阶段之前和之后运行代码. 例如,OnActionExecuting 在调用操作方法之前调用. OnActionEx

ASP.NET Core 2.2 WebApi 系列【八】统一返回格式(返回值、模型验证、异常)

现阶段,基本上都是前后端分离项目,这样一来,就需要前后端配合,没有统一返回格式,那么对接起来会很麻烦,浪费时间.我们需要把所有接口及异常错误信息都返回一定的Json格式,有利于前端处理,从而提高了工作效率. 一.准备工作 定义响应实体类 /// <summary> /// 响应实体类 /// </summary> public class ResultModel { /// <summary> /// 状态码 /// </summary> public in

你真的了解ASP.NET Core 部署模型吗?

原文:你真的了解ASP.NET Core 部署模型吗? ----------------------------   以下内容针对 ASP.NET Core2.1,2.2出现IIS进程内寄宿 暂不展开讨论-------------------------- 相比ASP.NET,ASP.NET Core 2.1出现了3个新的组件:ASP.NET Core Module.Kestrel.dotnet.exe, 后面我们会理清楚这三个组件的作用和组件之间的交互原理. ASP.NET Core 设计的初

webapi - 模型验证

本次要和大家分享的是webapi的模型验证,讲解的内容可能不单单是做验证,但都是围绕模型来说明的:首先来吐槽下,今天下午老板为自己买了套新办公家具,看起来挺好说明老板有钱,不好的是我们干技术的又成了搬运工(谁叫技术部男的多呢哈哈),话说让我们搬点儿什么小座椅板凳就够了吧,为什么4大箱的家具都让我们动手,每箱东西拆分出来每件几乎需要至少4个人才能挪到的东西,而且不少呢,这是让我们搬完后不用上班的节奏吧:我很想问的是买这么贵的东西,难道不给包送和组装?行政部门就不能请点搬运工,非要节约这点钱(技术可

ASP.NET Web API模型验证以及异常处理方式

ASP.NET Web API的模型验证与ASP.NET MVC一样,都使用System.ComponentModel.DataAnnotations. 具体来说,比如有:[Required(ErrorMessage="")][Range(0, 999)][Bind(Exclude="")][DisplayName("")][StringLength(1024)]... 验证扩展可以看这里:http://dataannotationsextens