【问题标题】:MVC3 ValidationAttribute for DateTime? returning DateTime.Max in IsValid(...)日期时间的 MVC3 ValidationAttribute?在 IsValid(...) 中返回 DateTime.Max
【发布时间】:2012-11-26 23:27:37
【问题描述】:

我正在尝试为 DateTime 编写自定义 ValidationAttribute?

但是,当它到达IsValid(object value) 时,值已经是DateTime.Max

我在代码中看到的任何内容都没有设置此值,但这意味着我正在努力验证它。

我想要的规则是“Null or After Today”——这意味着如果有 Null 值,那很好,但如果有值,那么我想验证。

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; }
...

【问题讨论】:

    标签: c# asp.net-mvc-3 validationattribute


    【解决方案1】:

    这应该可以解决问题:

    public override bool IsValid(object value)
    {
        var dt = value as DateTime?;
    
        return dt == null || dt.Value.Date > DateTime.Today.AddDays(1).AddSeconds(-1);
    }
    

    【讨论】:

    • 这将确保 dt 在今天之后而不是明天 00:00。如果你没有减去日期,那么你应该使用这个(大于或等于):dt.Value >= DateTime.Today.AddDays(1)
    • @PeterKiss 但是如果 dt2 比 dt1 晚一秒, > 运算符也会返回 true。
    • dt = {31/12/9999 23:59:59}dt==null=false
    • 我想到的一件事......我正在使用 jQueryUI.datepicker 将选择器添加到我的视图中。但是,如果我将其留空并添加“必需”属性,那么它正确地无法通过客户端验证。
    • @BehnamEsmaili 使用第一种方法(不要忘记我们首先在今天添加一天!),这意味着您在明天,这是有效的。
    【解决方案2】:

    试试这个:

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

    【讨论】:

    • 查看上面的评论...value 在遇到此方法时不为空,因此它会(正确)解析为 DateTime(使用 DateTime.Max)作为值
    • @BlueChippy 你的问题在于 jquery UI datepicker 默认值。事实上 datepicker 总是会发布一个值然后你的字段永远不会为空。
    • 尝试使用 DateTime.Now 初始化您的日期字段,以防验证也返回 false。
    猜你喜欢
    • 2016-04-18
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    • 1970-01-01
    相关资源
    最近更新 更多