Как проверить дату при использовании `String` вместо типа` Date`? - PullRequest
5 голосов
/ 03 февраля 2011

В приложении Asp.net MVC я унаследовал эту проблему (если это проблема?), Где один разработчик использовал String для типа даты.

В моей модели свойство выглядит так:

[Required]
[DisplayName("Registration Date")]
public string Registrationdate { get; set; }

Бизнес-требование заключается в том, что поле не обязательно, но если в этих полях есть что-то, то это должна быть действительная дата.

Как бы вы реализовали это требование, без изменения типа данных ?

Ответы [ 4 ]

8 голосов
/ 03 февраля 2011

Похоже, вы используете System.ComponentModel.DataAnnotations.Лучший способ сделать это с помощью этой библиотеки - создать новый атрибут для проверки строк даты и применить его к свойству.Вот код для начала:

[AttributeUsage(AttributeTargets.Property, Inherited = true)]
class DateAttribute : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        var dateString = value as string;
        if (string.IsNullOrWhiteSpace(dateString))
        {
            return true; // Not our problem
        }
        DateTime result;
        var success = DateTime.TryParse(dateString, out result);
        return success;
    }

Возможно, вы захотите расширить этот код в зависимости от того, какие строки вы ожидаете от клиента.Кроме того, это не даст вам никакой проверки на стороне клиента.

6 голосов
/ 03 февраля 2011
public string Registrationdate { 
    get; 
    set {
        DateTime date;
        var isDate = DateTime.TryParse(value, out date);
        if (isDate) { 
            _registrationDate = value; 
        }
        else {
          // Throw exception
        }
    }
}
1 голос
/ 03 февраля 2011

(своего рода) псевдокод:

if (Registrationdate is not empty)
{
    RegistrationDateTime = new DateTime(Registrationdate);

    if (RegistrationDateTime is not valid DateTime)
        fail validation;
}
0 голосов
/ 03 февраля 2011

Как насчет регулярного выражения?Аннотации данных имеют атрибут регулярного выражения.Теперь вам нужно исправить формат, скажем, ISO (гггг / мм / дд), который может не соответствовать вашим требованиям.

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

Саймон

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...