使用Data Annotation验证DateTime(日期和小时)

时间:2011-03-22 11:23:31

标签: asp.net-mvc datetime data-annotations

我有以下代码:

        [DisplayName("58.Date and hour of birth")]
        [DataType(DataType.DateTime, ErrorMessage = "Please enter a valid date in the format dd/mm/yyyy hh:mm")]
        [Range(typeof(DateTime), "1/1/2011", "1/1/2016")]
        [RequiredToClose]
        public object V_58 { get; set; }

我想强制包含时间(格式为hh:mm),而不仅仅是日期。此代码将1/1/2011视为有效,因为它不包含小时,有关如何表达正确格式的任何线索? (dd / mm / yyyy hh:mm)

4 个答案:

答案 0 :(得分:28)

您可以编写自己的ValidationAttribute并使用它来装饰属性。您可以使用自己的逻辑覆盖IsValid方法。

public class MyAwesomeDateValidation : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        DateTime dt;
        bool parsed = DateTime.TryParse((string)value, out dt);
        if(!parsed)
            return false;

        // eliminate other invalid values, etc
        // if contains valid hour for your business logic, etc

        return true;
    }
}

最后,装饰你的财产:

[MyAwesomeDateValidation(ErrorMessage="You were born in another dimension")]
public object V_58 { get; set; }

注意:要警惕属性上的多个验证属性,因为无法在没有更多自定义的情况下确定它们的评估顺序,并且随后验证逻辑重叠,您的错误消息可能无法准确描述您的确切含义该财产是错的(是的,这是一个连续的判决)

答案 1 :(得分:4)

最后使用自定义ValidationAttribute解决:

public class DateTimeValidation : RegularExpressionAttribute {
    public DateTimeValidation()
        : base(@"^((((31\/(0?[13578]|1[02]))|((29|30)\/(0?[1,3-9]|1[0-2])))\/(1[6-9]|[2-9]\d)?\d{2})|(29\/0?2\/(((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))|(0?[1-9]|1\d|2[0-8])\/((0?[1-9])|(1[0-2]))\/((1[6-9]|[2-9]\d)?\d{2})) (20|21|22|23|[0-1]?\d):[0-5]?\d$") {
        ErrorMessage = "Date must be in the format of : dd/mm/yyyy hh:mm";
    }
}

答案 2 :(得分:0)

如果您只是在字符串中传递日期,则会将其视为凌晨12:00。如果您想在字符串中传递时间,请使用“06/06/2011 7:00 PM”语法。

其他解决方法是将字符串保持原样,将其转换为DateTime&然后根据您的需要将AddHours& /或AddMinutes添加到DateTime对象。

答案 3 :(得分:0)

此解决方案不允许输入时间00.00,但可以使用其他值。

public class TimeRequiredAttribute : ValidationAttribute
{
    protected override IsValid(object value)
    {
        DateTime result;
        bool parsed = DateTime.TryParse((string)value, out result);
        if(!parsed && DateTime.MinValue.TimeOfDay == result.TimeOfDay)
        {
           return false;
        }
        return true;
    }
}

但它只适用于字符串proprety。