如何在asp.net core中通过属性名从模型中获得验证属性

本文关键字:属性 验证 模型 asp net core | 更新日期: 2023-09-27 18:06:04

我使用从ModelClientValidationRule类返回验证参数的validator.GetClientValidationRules()方法。而且,它可以完美地适用于所有验证属性,但遗憾的是在ASP中不行。净的核心。是否有一些公共API可以用来从ASP中的验证属性获取验证参数?网络核心?

我的模型:

public class Movie {
    public int ID { get; set; }
    [StringLength(60, MinimumLength = 3)]
    public string Title { get; set; }
    [Display(Name = "Release Date")]
    [DataType(DataType.Date)]
    public DateTime ReleaseDate { get; set; }
    [RegularExpression(@"^[A-Z]+[a-zA-Z''-''s]*$")]
    [Required]
    [StringLength(30)]
    public string Genre { get; set; }
    [Range(1, 100)]
    [DataType(DataType.Currency)]
    public decimal Price { get; set; }
    [RegularExpression(@"^[A-Z]+[a-zA-Z''-''s]*$")]
    [StringLength(5)]
    public string Rating { get; set; }
}

这是我的方法,通过模型的属性名生成客户端验证规则:

    IEnumerable<IDictionary<string, object>> GetValidationRulesByPropertyName(string propertyName) {
        IList<IDictionary<string, object>> clientValidationRules = new List<IDictionary<string, object>>();
        ModelMetadata modelMetaData = ModelMetadata.FromStringExpression(propertyName, this.ViewContext.ViewData);
        IEnumerable<ModelValidator> validators = ModelValidatorProviders.Providers.GetValidators(modelMetaData, this.ViewContext);
        foreach(ModelValidator validator in validators) {
            foreach(ModelClientValidationRule rule in validator.GetClientValidationRules()) {
                IDictionary<string, object> clientValidationRule = new Dictionary<string, object>() {
                    ["type"] = rule.ValidationType,
                    ["message"] = rule.ErrorMessage
                };
                rule.ValidationParameters.AddTo(clientValidationRule);
                clientValidationRules.Add(clientValidationRule);
            }
        }
        return clientValidationRules;
    }
}

如何在asp.net core中通过属性名从模型中获得验证属性

这个问题在如何通过属性名称从模型获得验证属性中得到解决?

我正在使用流畅的验证。实现起来非常简单:https://github.com/JeremySkinner/FluentValidation

ViewModel验证示例:

public class PersonalDetailViewModelValidator : AbstractValidator<PersonalDetailViewModel>
    {
       public PersonalDetailViewModelValidator()
            {
                RuleFor(p => p.Address).Length(0, 99);
                RuleFor(p => p.ZipCode).Length(0, 10);
                RuleFor(p => p.City).Length(0, 100);
            }
    }