Я сейчас выбросил RegularExpression
. Кажется, он не подходит для свойства типа DateTime
. Затем я создал новый атрибут проверки для DateTime и обнуляемый DateTime:
[AttributeUsage(AttributeTargets.Property, Inherited = false,
AllowMultiple = false)]
public sealed class DateOnlyAttribute : ValidationAttribute
{
public DateOnlyAttribute() :
base("\"{0}\" must be a date without time portion.")
{
}
public override bool IsValid(object value)
{
if (value != null)
{
if (value.GetType() == typeof(DateTime))
{
DateTime dateTime = (DateTime)value;
return dateTime.TimeOfDay == TimeSpan.Zero;
}
else if (value.GetType() == typeof(Nullable<DateTime>))
{
DateTime? dateTime = (DateTime?)value;
return !dateTime.HasValue
|| dateTime.Value.TimeOfDay == TimeSpan.Zero;
}
}
return true;
}
public override string FormatErrorMessage(string name)
{
return string.Format(CultureInfo.CurrentCulture,
ErrorMessageString, name);
}
}
Использование:
[DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode=true)]
[DateOnly]
public DateTime MyDate { get; set; }
Не обеспечивает проверку на стороне клиента. На стороне сервера проверка опирается на привязку модели (чтобы убедиться, что введенная строка вообще может быть преобразована в DateTime
). Если пользователь ввел часть времени, отличную от полуночи, включается атрибут DateOnly
, и он получает предупреждение о том, что следует вводить только дату.