• 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 全球文件中添加

    结果:

  • 相关阅读:
    模态对话框可能导致程序崩溃
    C++实现将字符串循环左移n个位置
    Android Gallery图片显示和文字提示及Menu 菜单
    android代码实现ScaleAnimation
    Android系统内存管理的问题
    android打电话发短信
    android开发之屏幕设置
    输入法
    黄金周
    气筒
  • 原文地址:https://www.cnblogs.com/Sea1ee/p/10490006.html
Copyright © 2020-2023  润新知