如何通过asp.net核心中的属性名称从模型中获取验证属性

Posted

技术标签:

【中文标题】如何通过asp.net核心中的属性名称从模型中获取验证属性【英文标题】:How to get a validation attr from model by property name in asp.net core 【发布时间】: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;
    

【问题讨论】:

【参考方案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);
            
    

【讨论】:

你确定这个库可以在 asp.net 核心应用程序中工作吗?这个github.com/JeremySkinner/FluentValidation/issues/309 问题没有关闭。 我在生产环境中使用它和 kendo MVVM。【参考方案2】:

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

【讨论】:

以上是关于如何通过asp.net核心中的属性名称从模型中获取验证属性的主要内容,如果未能解决你的问题,请参考以下文章

如何从剃刀视图提交具有动态列表的模型中的列表? ASP.NET 核心 3.1

如何从 ASP.NET 核心 mvc 向 asp.net 核心中的 Web API 发出 PUT 请求?

将自定义模型绑定器应用于 asp.net 核心中的对象属性

无法从模型中获取 ASP.Net 中的相关数据

JWT:如何从声明中的特定键获取值列表。 C# Asp.Net 核心

从 asp.net 核心标识中获取 applicationuser 的属性