Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 带有数据批注的日期时间(日期和小时)验证_Asp.net Mvc_Datetime_Data Annotations - Fatal编程技术网

Asp.net mvc 带有数据批注的日期时间(日期和小时)验证

Asp.net mvc 带有数据批注的日期时间(日期和小时)验证,asp.net-mvc,datetime,data-annotations,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")] [RequiredToC

我有以下代码:

        [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),而不仅仅是日期。这段代码认为2011年1月1日是有效的,但不应该,因为它不包含小时,关于如何表达正确格式的任何线索?(DD/MM/YYYY HH:MM)

< P>如果您只在字符串中传递日期,则将其视为上午12:00。如果要在字符串中传递时间,请使用“06/06/2011 7:00pm”语法


其他解决方法是保持字符串的原样,将其转换为DateTime,然后根据需要向DateTime对象添加小时和/或分钟。

您可以编写自己的
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; }

注意:要小心属性上的多个验证属性,因为如果没有更多的自定义,就无法确定它们的求值顺序,并且如果验证逻辑重叠,则错误消息可能无法准确地描述您认为属性错误的确切含义(是的,这是一个连续的句子)

最终通过自定义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";
    }
}

此解决方案不允许输入时间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;
    }
}

但它只适用于字符串。

您应该考虑对您以前的一些问题的答案。请记住,直接从验证属性继承意味着内置的客户端验证将不工作,因此最好从RealReXPrsieAtvices继承(如@ USER 329 957)。这样内置的正则表达式就可以在客户端上自动工作。IsValid需要是公共的,而不是受保护的。