如何通过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 请求?