webapi中的模型验证

mic: https://docs.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/model-validation-in-aspnet-web-api

webapi中推荐我们使用Dto来创建接受实体和输出实体,对于有些传入/请求的参数是有限制的,非空,电话等等,我们可以统一进行处理这些。

需要了解:

webapi接受json参数:webapi 获取json数据

数据注解:Code First 二 DataAnnotation 数据注解

 

流程:我们需要使用方法过滤器在每次执行方法之前进行验证,处理验证结果。我们Dto需要使用数据注解来标识

单个方法验证:

   
[HttpPost]
public async Task<IHttpActionResult> VerifyAsync(TestInDto inDto) { if (ModelState.IsValid) { return await Task.FromResult(Ok(inDto)); } else { List<KeyValuePair<string, ModelState>> vs = ModelState.ToList(); List<object> obj = new List<object>(); foreach (KeyValuePair<string, ModelState> item in vs) { IList<string> strList = new List<string>(); foreach (var err in item.Value.Errors) { strList.Add(err.ErrorMessage); } obj.Add(new { key = item.Key.Split('.')[1], errorMessage = strList }); } return await Task.FromResult(Ok(new { errcode=-1,err=obj})); } }
 public class TestInDto
    {
        /// <summary>
        /// id
        /// </summary>
        public int? Id { get; set; }

        /// <summary>
        /// 
        /// </summary>
        [Required(ErrorMessage ="名字不能为空")]
        [StringLength(maximumLength:50,ErrorMessage ="最大长度不能超过50")]
        public string Name { get; set; }
    }

 

使用方法过滤器:

①创建自己的方法过滤器

 public class MyActionFilterAttribute : ActionFilterAttribute
    {
        public override Task OnActionExecutingAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
        {
            if (!actionContext.ModelState.IsValid)
            {
                List<KeyValuePair<string, ModelState>> vs = actionContext.ModelState.ToList();
                List<object> objList = new List<object>();
                foreach (KeyValuePair<string, ModelState> item in vs)
                {
                    IList<string> strList = new List<string>();
                    foreach (ModelError err in item.Value.Errors)
                    {
                        strList.Add(err.ErrorMessage);
                    }
                    objList.Add(new
                    {
                        key = item.Key.Split('.')[1],
                        errorMessage = strList
                    });
                }
                var obj = new
                {
                    errcode = -1,
                    err = objList
                };
                actionContext.Response = new HttpResponseMessage()
                {
                    Content = new StringContent(JsonConvert.SerializeObject(obj), Encoding.UTF8, "application/json")

                };
            }

            return base.OnActionExecutingAsync(actionContext, cancellationToken);
        }

 

②使用

针对单个方法:在方法上面使用特性来标识,也可以在控制器上面

 

 全局:Global.asax 全球文件中添加

 

结果:

 

posted @ 2019-03-07 15:38  Sealee  阅读(325)  评论(0编辑  收藏  举报