在MVC中,当我们发布了一个模型来行动,我们才会以验证针对模型的数据注释模型如下:ASP.NET核心 - 自定义模型验证
if (ModelState.IsValid)
如果我们标记属性作为[必需],则ModelState.IsValid将验证该属性是否包含值。
我的问题:我如何手动构建并运行自定义验证器?
P.S.我只是在讨论后端验证程序。
在MVC中,当我们发布了一个模型来行动,我们才会以验证针对模型的数据注释模型如下:ASP.NET核心 - 自定义模型验证
if (ModelState.IsValid)
如果我们标记属性作为[必需],则ModelState.IsValid将验证该属性是否包含值。
我的问题:我如何手动构建并运行自定义验证器?
P.S.我只是在讨论后端验证程序。
在.NET中的核心,你可以简单地创建从ValidationAttribute
继承的类。您可以在ASP.NET Core MVC Docs中看到完整的详细信息。
下面是从文档直接采取的例子:
public class ClassicMovieAttribute : ValidationAttribute
{
private int _year;
public ClassicMovieAttribute(int Year)
{
_year = Year;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
Movie movie = (Movie)validationContext.ObjectInstance;
if (movie.Genre == Genre.Classic && movie.ReleaseDate.Year > _year)
{
return new ValidationResult(GetErrorMessage());
}
return ValidationResult.Success;
}
}
我已经适应了排除客户端验证的例子,如你的问题提出要求。
为了使用这个新属性(再次,从文档拍摄),你需要把它添加到相关领域:
[ClassicMovie(1960)]
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
下面是另一个,确保值为true
简单的例子:
[EnforceTrue]
public bool ThisShouldBeTrue { get; set; }
:
public class EnforceTrueAttribute : ValidationAttribute
{
public EnforceTrueAttribute()
: base("The {0} field must be true.") { }
public override bool IsValid(object value) =>
value is bool valueAsBool && valueAsBool;
}
此以相同的方式被施加
要在.Net Core
中创建自定义验证属性,您需要继承IModelValidator
并实施Validate
方法。
public class ValidUrlAttribute : Attribute, IModelValidator
{
public string ErrorMessage { get; set; }
IEnumerable<ModelValidationResult> Validate(ModelValidationContext context)
{
var url = context.Model as string;
if (url != null &&
Uri.IsWellFormedUriString(url, UriKind.Absolute))
{
return Enumerable.Empty<ModelValidationResult>();
}
return new List<ModelValidationResult>
{
new ModelValidationResult("", ErrorMessage)
};
}
}
public class Product
{
public int ProductId { get; set; }
[Required]
public string ProductName { get; set; }
[Required]
[ValidUrl]
public string ProductThumbnailUrl { get; set; }
}