2013-11-09 19 views

答えて

53

Fluent ValidationまたはMVC Foolproof Validationをご覧ください:多くのことが役に立ちます。

たとえば、日付プロパティで使用できるアノテーションよりも[GreaterThan("StartDate")]注釈があります。

それとも、他のライブラリを使用したくない場合は、あなたがあなたのモデルにIValidatableObjectを実装することで、独自のカスタム検証を実装できます。

public class ViewModel: IValidatableObject 
{ 
    [Required] 
    public DateTime StartDate { get; set; } 
    [Required]  
    public DateTime EndDate { get; set; } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     if (EndDate < StartDate) 
     { 
      yield return 
      new ValidationResult(errorMessage: "EndDate must be greater than StartDate", 
            memberNames: new[] { "EndDate" }); 
     } 
    } 
} 
+0

これはクライアント側(JS)では正しく動作しません。送信時にのみこのメッセージが表示されますか? – Davor

+0

@Davorこれはクライアント側でも機能します。 –

+2

戻り値の型はIEnumerable であるため、yield returns new ValidationResult ...を実行するとより良い結果が得られます。 :) –

9

IValidatableObjectインタフェースが実装検証するオブジェクトのための方法を提供しますIValidatableObject.Validate(ValidationContext validationContext)メソッドです。このメソッドは常にIEnumerableオブジェクトを返します。そのため、ValidationResultオブジェクトのリストを作成し、これにエラーを追加して戻す必要があります。空リストは、あなたの条件を検証することを意味します。これはmvc 4で次のようになります...

public class LibProject : IValidatableObject 
{ 
    [Required(ErrorMessage="Project name required")] 

    public string Project_name { get; set; } 
    [Required(ErrorMessage = "Job no required")] 
    public string Job_no { get; set; } 
    public string Client { get; set; } 
    [DataType(DataType.Date,ErrorMessage="Invalid Date")] 
    public DateTime ExpireDate { get; set; } 


    IEnumerable<ValidationResult> IValidatableObject.Validate(ValidationContext validationContext) 
    { 
     List <ValidationResult> res =new List<ValidationResult>(); 
     if (ExpireDate < DateTime.Today) 
     { 
      ValidationResult mss=new ValidationResult("Expire date must be greater than or equal to Today"); 
      res.Add(mss); 

     } 
     return res; 
    } 
} 
+1

このソリューションは、比較するケースが複数ある場合に備えて、検証結果の一覧が必要なため、選択した回答より優れています。ありがとう。 –

関連する問題