2017-10-11 11 views
2

我々はそのモデルのデータ注釈に対してモデルを検証するために、次の手順を実行アクションにモデルを投稿:我々はマークするとASP.NETコア - MVCのカスタムモデルの検証

if (ModelState.IsValid) 

プロパティを[必須]として設定すると、ModelState.IsValidは値を含むかどうかを検証します。

私の質問:カスタムバリデータを手動でビルドして実行するにはどうすればよいですか?

P.S.私はバックエンドのバリデータだけについて話しています。

答えて

4

、あなたは単に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であることを確実にするための別の、シンプルな例です:

public class EnforceTrueAttribute : ValidationAttribute 
{ 
    public EnforceTrueAttribute() 
     : base("The {0} field must be true.") { } 

    public override bool IsValid(object value) => 
     value is bool valueAsBool && valueAsBool; 
} 

これは、同じように適用されます。

[EnforceTrue] 
public bool ThisShouldBeTrue { get; set; } 
2

.Net Coreにカスタム検証属性を作成するには、から継承し、Validateメソッドを実装する必要があります。 .NETのコアで

カスタムバリデータ

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; } 
} 
関連する問題