驗證的多種方式
一、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("必須要填寫區域信息"); } }
五、其他