验证的多种方式
一、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("必须要填写区域信息"); } }