2017-10-11 173 views
2

在MVC中,當我們發佈了一個模型來行動,我們纔會以驗證針對模型的數據註釋模型如下:ASP.NET核心 - 自定義模型驗證

if (ModelState.IsValid) 

如果我們標記屬性作爲[必需],則ModelState.IsValid將驗證該屬性是否包含值。

我的問題:我如何手動構建並運行自定義驗證器?

P.S.我只是在討論後端驗證程序。

回答

4

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

此以相同的方式被施加

2

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