zoukankan      html  css  js  c++  java
  • 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 全球文件中添加

    结果:

  • 相关阅读:
    ArrayList removeRange方法分析
    LinkedHashMap源码分析(基于JDK1.6)
    LinkedList原码分析(基于JDK1.6)
    TreeMap源码分析——深入分析(基于JDK1.6)
    51NOD 2072 装箱问题 背包问题 01 背包 DP 动态规划
    51 NOD 1049 最大子段和 动态规划 模板 板子 DP
    51NOD 1006 最长公共子序列 Lcs 动态规划 DP 模板题 板子
    8月20日 训练日记
    CodeForces
    CodeForces
  • 原文地址:https://www.cnblogs.com/Sea1ee/p/10490006.html
Copyright © 2011-2022 走看看