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("必须要填写区域信息");
        }
    }

 

 

五、其他

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM