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