.NET MVC Custom Validator
Я буду заниматься написанием стандартного класса проверки даты завтра для приложения для собраний, над которым я работаю на работе, который будет проверять, будет ли данный старт или дата окончания A) меньше текущей даты, или B) начало дата больше, чем дата окончания собрания (или наоборот).
Я думаю, что это, вероятно, довольно распространенное требование. Может ли кто-нибудь указать мне направление сообщения в блоге, которое могло бы помочь мне в решении этой проблемы?
Я использую .net 3.5, поэтому я не могу использовать новый валидатор модели api, встроенный в .NET 4. Проект, над которым я работаю, это MVC 2.
ОБНОВЛЕНИЕ: класс, который я пишу, должен расширить пространство имен System.ComponentModel.DataAnnotations. В .NET 4 есть интерфейс IValidateObject, который вы можете реализовать, что делает эту вещь абсолютной ошибкой, но, к сожалению, я не могу использовать .Net 4. Как я могу сделать то же самое в .Net 3.5?
Ответы
Ответ 1
public sealed class DateStartAttribute : ValidationAttribute
{
public override bool IsValid(object value)
{
DateTime dateStart = (DateTime)value;
// Meeting must start in the future time.
return (dateStart > DateTime.Now);
}
}
public sealed class DateEndAttribute : ValidationAttribute
{
public string DateStartProperty { get; set; }
public override bool IsValid(object value)
{
// Get Value of the DateStart property
string dateStartString = HttpContext.Current.Request[DateStartProperty];
DateTime dateEnd = (DateTime)value;
DateTime dateStart = DateTime.Parse(dateStartString);
// Meeting start time must be before the end time
return dateStart < dateEnd;
}
}
и в вашей модели просмотра:
[DateStart]
public DateTime StartDate{ get; set; }
[DateEnd(DateStartProperty="StartDate")]
public DateTime EndDate{ get; set; }
В своем действии просто проверьте, что ModelState.IsValid. Что вы после?
Ответ 2
Я знаю, что этот пост старше, но это решение я нашел намного лучше.
Принятое решение в этом сообщении не будет работать, если объект имеет префикс, когда он является частью модели представления.
то есть. строки
// Get Value of the DateStart property
string dateStartString = HttpContext.Current.Request[DateStartProperty];
Лучшее решение можно найти здесь:
http://www.a2zdotnet.com/View.aspx?Id=182
Ответ 3
Я думаю, что это должно сделать это:
public boolean MeetingIsValid( DateTime start, DateTime end )
{
if( start < DateTime.Now || end < DateTime.Now )
return false;
return start > end || end < start;
}