zoukankan      html  css  js  c++  java
  • asp.net core 模型验证的多种方式

    验证的多种方式

    一、Data Annotation

      这种方式就是微软已经实现的attribute,使用十分方便。

      如:

            [Display(Name = "身份")]
            [Required(ErrorMessage = "{0}必须不能为空")]
            public string Id { get; set; }

      其中{0}表示第一个Name。

    二、自定义Attribute

      自定义验证规则,只需要继承ValidationAttribute,然后重写IsValid方法即可,如果模型没有问题,则返回ValidationResult.Success,或者返回Null;

      

        /// <summary>
        /// 用于类验证。
        /// </summary>
        [AttributeUsage(AttributeTargets.Class)]
        public sealed class MustNoEmptyAttribute : ValidationAttribute
        {
            protected override ValidationResult IsValid(object value, ValidationContext validationContext)
            {
                var model = validationContext.ObjectInstance as ValidationModel;
                if (model.Address == string.Empty)
                {
                    return new ValidationResult(ErrorMessage);
                }
    
                return ValidationResult.Success;
            }
        }

      特性的优先级最高,当特性验证不通过是,不会走属性上的验证。

      在调用是,可以通过的属性ErrorMessage赋值特定的错误信息。

    三、实现IValidationAttribute

      直接在类上继承IValidatableObject,然后实现Validate接口即可。这种方式,十分简单的就可以实现复杂的验证方式。

      

            public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
            {
                if (Number < 100 && Address.Length > 10)
                {
                    yield return new ValidationResult("{0}数值小于100时,地址不能大于10");
                }
            }

    四、使用第三方组件FluentValidation

      第三方组件,可以使用这个。

      好处是容易定义复杂的允许,验证规则与model分离。

      首先需要在Startup中配置。

      

                services.AddControllers()
                    .AddFluentValidation(fv=> 
                    {
                        // 混用规则。
                        fv.RunDefaultMvcValidationAfterFluentValidationExecutes = true;
                        fv.RegisterValidatorsFromAssembly(Assembly.GetAssembly(this.GetType()));
                    })
                    .ConfigureApiBehaviorOptions(setup =>
                    {
                        setup.InvalidModelStateResponseFactory = context =>
                        {
                            var problemDetails = new ValidationProblemDetails(context.ModelState)
                            {
                                Type = "https://www.cnblogs.com/passzhang/articles/9388325.html,
                                Title = "数据发错误",
                                Status = StatusCodes.Status422UnprocessableEntity,
                                Detail = "请查看相关的文档",
                                Instance = context.HttpContext.Request.Path
                            };
    
                            problemDetails.Extensions.Add("traceId", context.HttpContext.TraceIdentifier);
                            return new UnprocessableEntityObjectResult(problemDetails)
                            {
                                ContentTypes = {
                                    MediaTypeNames.Application.Json
                                }
                            };
                        };
                    });

      然后新建类,继承AsbtractValidator<T>

        public class SearchWeatherDataValidators : AbstractValidator<SearchWeatherData>
        {
            public SearchWeatherDataValidators()
            {
                RuleFor(o => o.City)
                    .Custom((o, c) =>
                    {
                        if (string.IsNullOrEmpty(o))
                        {
                            c.AddFailure($"{c.DisplayName}不能为空,也不能为null");
                        }
                    });
    
                RuleFor(o => o.District)
                    .NotNull()
                    .NotEmpty()
                    // 当条件成立时,将不会提示错误。
                    .When(o =>
                    !string.IsNullOrWhiteSpace(o.City)
                    )
                    .WithMessage("必须要填写区域信息");
            }
        }

     

    五、其他

  • 相关阅读:
    python常用模块(3)
    python中的re模块
    python中的常用模块
    python中的模块及路径
    python中的文件操作(2)
    【weixin】微信支付简介
    【其他】博客园样式修改
    【weixin】微信企业号和公众号区别和关系是什么?
    【其他】./ 和../ 以及/区别
    【sdudy】ASCII,Unicode和UTF-8终于找到一个能完全搞清楚的文章了
  • 原文地址:https://www.cnblogs.com/yeqifeng2288/p/12387638.html
Copyright © 2011-2022 走看看