2017-01-27 7 views
5

ASP.NETコアでカスタム属性を作成して、1つの日付プロパティがモデル内の他の日付プロパティよりも小さい場合、ValidationAttributeを使用して検証します。カスタム検証属性:同じモデル内の2つのプロパティの比較

私はこれを考えてみましょう:私は別のライブラリを使用することが提案されている他のSOのポストを見つけました、しかし、私は固執することを好む

public class CompareDates : ValidationAttribute 
{ 
    public CompareDates() 
     : base("") { } 

    public override bool IsValid(object value) 
    { 
     return base.IsValid(value); 
    } 

} 

public class MyViewModel 
{ 
    [Required] 
    [CompareDates] 
    public DateTime StartDate { get; set; } 

    [Required] 
    public DateTime EndDate { get; set; } = DateTime.Parse("3000-01-01"); 
} 

私はこのような何かを使用しようとしていますそれが実行可能であった場合は、ValidationAttributeを使用します。

答えて

11

比較2つのプロパティに対してカスタム検証属性を作成できます。これは、サーバー側の検証です:

public class MyViewModel 
{ 
    [DateLessThan("End", ErrorMessage = "Not valid")] 
    public DateTime Begin { get; set; } 

    public DateTime End { get; set; } 
} 

public class DateLessThanAttribute : ValidationAttribute 
{ 
    private readonly string _comparisonProperty; 

    public DateLessThanAttribute(string comparisonProperty) 
    { 
     _comparisonProperty = comparisonProperty; 
    } 

    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     ErrorMessage = ErrorMessageString; 
     var currentValue = (DateTime)value; 

     var property = validationContext.ObjectType.GetProperty(_comparisonProperty); 

     if (property == null) 
      throw new ArgumentException("Property with this name not found"); 

     var comparisonValue = (DateTime)property.GetValue(validationContext.ObjectInstance); 

     if (currentValue > comparisonValue) 
      return new ValidationResult(ErrorMessage); 

     return ValidationResult.Success; 
    } 
} 

更新: この属性のためのクライアント側の検証が必要な場合は、IClientModelValidatorインターフェイスを実装が必要です。

public class DateLessThanAttribute : ValidationAttribute, IClientModelValidator 
{ 
    ... 
    public void AddValidation(ClientModelValidationContext context) 
    { 
     var error = FormatErrorMessage(context.ModelMetadata.GetDisplayName()); 
     context.Attributes.Add("data-val", "true"); 
     context.Attributes.Add("data-val-error", error); 
    } 
} 

AddValidation方法はに属性を追加しますあなたの入力はcontext.Attributesです。

enter image description here

あなたはここにIClientModelValidator

+0

私はこれを行い、サーバー側は検証しますが、クライアント側は何もしませんか? – JsonStatham

2

IsValidメソッドで2つの日付を比較できます。一つの可能​​な選択肢として

public class CompareDates : ValidationAttribute 
{ 
    protected override ValidationResult 
      IsValid(object value, ValidationContext validationContext) 
    { 
     //get your startdate & end date from model and value 


     //perform comparison 
     if (StartDate < EndDate) 
     { 
      return new ValidationResult 
       ("start date must be less than the end date"); 
     } 
     else 
     { 
      return ValidationResult.Success; 
     } 
    } 
} 
4

自己検証

あなたはちょうどあなたがあなたの検証コードを置くことができる方法Validate、とのインタフェースIValidatableObjectを実装する必要があります。

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

[Required] 
public DateTime EndDate { get; set; } = DateTime.Parse("3000-01-01"); 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     int result = DateTime.Compare(StartDate , EndDate); 
     if (result < 0) 
     { 
      yield return new ValidationResult("start date must be less than the end date!", new [] { "ConfirmEmail" }); 
     } 
    } 
} 
+0

おかげで多くを読むことができますが、私は属性としてそれを実装する必要があります。 – Coding

関連する問題