.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类有三个属性,姓名,电话,年纪。ide

2.建立一个接口并以Person做为input参数而且返回input对象post

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吗?这时候模型验证就发挥做用啦。 ui

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; }
    }

在次调用这个接口。spa

    

     若是参数参数的不合法会直接400且会根据定义的提示去提示前端参数哪里不合法。可是不少小伙伴的返回值都是通用的,怎么把这些提示放到本身的通用返回值里面呢?code

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.测试

  

    模型验证经过blog

  

相关文章
相关标签/搜索