2017-10-11 150 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; } 
}