【问题标题】:How to get a validation attr from model by property name in asp.net core如何通过asp.net核心中的属性名称从模型中获取验证属性
【发布时间】:2017-01-13 23:48:20
【问题描述】:

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

我的模特:

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;
    }
}

【问题讨论】:

    标签: c# .net asp.net-mvc asp.net-core


    【解决方案1】:

    我正在为此使用流利的验证。实现起来非常简单: 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);
                }
        }
    

    【讨论】:

    【解决方案2】:

    此问题已在 github 上的How to get a validation attr from model by property name? 中解决。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-04
      • 2020-03-16
      • 2018-11-16
      • 1970-01-01
      • 1970-01-01
      • 2013-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多