2012-12-09 37 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。 –

相关问题