2012-12-09 52 views
3

我想寫一個DateTime的自定義ValidationAttribute?MVC3 ValidationAttribute for DateTime?返回DateTime.Max在IsValid(...)

然而,當它擊中IsValid(object value)值已經DateTime.Max

什麼我可以在我的代碼中看到已將此值設置,但它意味着我在努力對其進行驗證。

我想要的規則是「空或今日之後」 - 這意味着如果有一個空值,那麼它很好,但如果有一個值,那麼我想驗證。

public class AfterTodayAttribute : ValidationAttribute, IClientValidatable 
{ 
    public AfterTodayAttribute() 
    { 
    } 

    //Tried this as well...same result 
    //protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    //{ 
    // return base.IsValid(value, validationContext); 
    //} 

    public override bool IsValid(object value) 
    { 
     //value is already a DateTime and set to DateTime.Max 
     var valid = false; // for testing only 
     return valid; 
    } 
} 

... 
[Display(Description = "Expiry Date")] 
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)] 
[DataType(DataType.Date)] 
[AfterToday(false, ErrorMessage = "The Limit Expiry Date must be later than Today")] 
public DateTime? NewExpiryDate { get; set; } 
... 

回答

1

這應該做的伎倆:

public override bool IsValid(object value) 
{ 
    var dt = value as DateTime?; 

    return dt == null || dt.Value.Date > DateTime.Today.AddDays(1).AddSeconds(-1); 
} 
+0

爲什麼加-1秒? – AgentFire

+0

這將確保dt在今天之後而不是明天00:00。如果你沒有減少日期,那麼你應該使用這個(大於或等於):dt.Value> = DateTime.Today.AddDays(1) –

+0

@PeterKiss但如果偶數dt2比dt1晚一秒,則運算符將返回true。 –

0

試試這個:

public override bool IsValid(object value) 
    {   
     var dateValue = (DateTime ?) value; 
     return dateValue.HasValue ? dateValue.Value > DateTime.Now : true; 
    } 
+0

查看上面的評論...'value'不是null當它擊中這個方法,因此它解析(正確)到一個DateTime(與DateTime.Max)作爲值 – BlueChippy

+0

@BlueChippy你的問題是與jQuery UI的日期選取器默認value.in事實上datepicker總是會發佈一個值,那麼你的領域永遠不會是空的。 –

+0

嘗試使用DateTime.Now初始化you'r日期字段,以防驗證也將返回false。 –

相關問題