2010-08-31 3 views
12

Я буду заниматься написанием пользовательского класса проверки даты завтра для приложения для собраний, над которым я работаю, что будет проверять, будет ли данный старт или дата окончания A) меньше текущей даты , или B) дата начала больше даты окончания собрания (или наоборот)..NET MVC Custom Validator

Я думаю, что это, вероятно, довольно распространенное требование. Может ли кто-нибудь указать мне направление сообщения в блоге, которое могло бы помочь мне решить эту проблему?

Я использую .net 3.5, так что я не могу использовать новую модель валидатора API, встроенный в .NET 4. Проект Я работаю на это MVC 2.

UPDATE: Класс я письму необходимо расширить пространство имен System.ComponentModel.DataAnnotations. В .NET 4 есть интерфейс IValidateObject, который вы можете реализовать, что делает эту вещь абсолютной ошибкой, но, к сожалению, я не могу использовать .Net 4. Как мне сделать то же самое в .NET 3.5?

+0

Я просто работаю над этим. Может быть, это поможет: [CompareDatesValidator] [1] [1]: http://stackoverflow.com/questions/2848684/compare-dates-dataannotations-validation-asp-net-mvc/8070779 # 8070779 – free4ride

+0

Я только что работал над этим. Может быть, это поможет: [введите описание ссылки здесь] [1] [1]: http://stackoverflow.com/questions/2848684/compare-dates-dataannotations-validation-asp-net- mvc/8070779 # 8070779 – free4ride

ответ

21
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. Это то, что тебе нужно?

+0

Хорошо выглядит, я не могу проверить его на данный момент, но я смогу сделать это к концу дня. Благодаря! – MrBliz

+0

В этом случае, как я могу получить значения для StartDate и EndDate из модели, так как они оба введенные пользователем значения? – MrBliz

+0

Изменен мой ответ. :) Итак, StartDate проверяет с DateTime.Now. EndDate проверяет с помощью StartDate, который вводится пользователем, чтобы убедиться, что он находится после даты начала. –

1

Я думаю, что это нужно сделать, это:

public boolean MeetingIsValid(DateTime start, DateTime end) 
{ 
     if(start < DateTime.Now || end < DateTime.Now) 
      return false; 

     return start > end || end < start; 
} 
+0

Привет, спасибо, прочитав ответ, я понял, что мне нужно предоставить мою информацию. Конечно, код, который вы предоставили, будет проверять дату, но это была не та часть проблемы, в которой я застрял. Мне нужно было знать, какие интерфейсы реализовать для расширения пространства имен dataannotations. Спасибо, в любом случае. – MrBliz

4

Я знаю, что это сообщение старше, но это решение я нашел намного лучше.

Принятое решение в этом сообщении не будет работать, если объект имеет префикс, когда он является частью режима просмотра.

т.е. линии

// Get Value of the DateStart property 
string dateStartString = HttpContext.Current.Request[DateStartProperty]; 

Лучшее решение можно найти здесь: http://www.a2zdotnet.com/View.aspx?Id=182

+0

Определенно лучшее решение! +1 за полезную ссылку! – DanO

+0

Мертвая ссылка :-(... – nashwan