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