• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

asp.netcore模型验证的多种方式

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

 

 

五、其他

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
ASP.NETMVC的本地化支持(三)发布时间:2022-07-10
下一篇:
ASP.NET页面跳转方式及页面传值方式发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap