Проверка DateTime (даты и часа) с аннотацией данных - PullRequest
19 голосов
/ 22 марта 2011

У меня есть следующий код:

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

Я хочу принудительно включить время (в формате чч: мм), а не только дату.Этот код считает 01.01.2011 действительным, когда он не должен, так как он не содержит часа. Любая подсказка о том, как выразить правильный формат?(дд / мм / гггг чч: мм)

Ответы [ 4 ]

28 голосов
/ 22 марта 2011

Вы можете написать свой собственный 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; }

Примечание. Остерегайтесь нескольких атрибутов проверки ваших свойств, так какпорядок, в котором они оцениваются, не может быть определен без дополнительной настройки, и впоследствии, если логика проверки перекрывается, ваши сообщения об ошибках могут не точно описывать, что именно вы имеете в виду, что ошибаетесь со свойством (да, это условное предложение)

4 голосов
/ 23 марта 2011

Окончательно решено с помощью пользовательского атрибута валидации:

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";
    }
}
0 голосов
/ 19 марта 2012

Это решение не позволяет вводить время 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;
    }
}

Но оно будет работать только со свойствами строки.

0 голосов
/ 22 марта 2011

Если вы просто передадите дату в строке, она будет считаться 12:00.Если вы хотите передать время внутри строки, используйте синтаксис «06/06/2011 19:00 PM».

Другой обходной путь - сохранить строку как есть, преобразовать ее в DateTime и затем AddHours & / илиAddMinutes к объекту DateTime в зависимости от ваших потребностей.

...