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 全球文件中添加
结果: