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

  • 在接口开发过程中免不了要去验证参数的合法性,模型验证就是帮助我们去验证参数的合法性,我们可以在需要验证的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吗?这时候模型验证就发挥作用啦。 

4.修改之前的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且会根据定义的提示去提示前端参数哪里不合法。但是很多小伙伴的返回值都是通用的,怎么把这些提示放到自己的通用返回值里面呢?

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

    public class ResponseDto
    {/// <summary>
        /// 详细错误信息
        /// </summary>
        public string message { get; set; }

        /// <summary>
        /// 具体业务参数
        /// </summary>
        public object data { get; set; }
    }

6.定义一个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来判断模型验证是否通过。

7.配置过滤器

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 = "" }
                });
            });
        }

  8.测试

  

    模型验证通过

  

posted @ 2019-11-26 12:03  她微笑的脸  阅读(763)  评论(4编辑  收藏  举报