0

У меня есть следующее ValidationAttribute класса.Net MVC2 Как добавить ошибку в ModelState при использовании пользовательского ValidationAttribute

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)] 
public sealed class DateValidationAttribute : ValidationAttribute 
{ 
    public DateValidationAttribute(string leftDateProperty, CompareOperator compareOperator, string rightDateProperty, string errorMessage) 
      : base(errorMessage) 
    { 
     LeftDateProperty = leftDateProperty; 
     Operator = compareOperator; 
     RightDateProperty = rightDateProperty; 
    } 
    ... 
    ... 
} 

Он принимает два названия даты собственности и оператор в конструкторе.

В методе проверки возвращается результат действия LeftDate Operator RightDate.

public override bool IsValid(object value) 
{ 
    DateTime leftDate; 
    DateTime rightDate; 

    // Get all properties on the view model 
    PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(value); 

    DateTime rightDate = (DateTime)properties.Find(RightDateProperty, true).GetValue(value); 
    DateTime leftDate = (DateTime)properties.Find(LeftDateProperty, true).GetValue(value); 

    // Perform rule check 
    switch (Operator) 
    { 
     case CompareOperator.Equal: 
      return leftDate.Equals(rightDate); 
     case CompareOperator.Greater:      
      return leftDate > rightDate; 
     case CompareOperator.Lesser:      
      return leftDate < rightDate; 
     case CompareOperator.GreaterOrEqual:      
      return leftDate >= rightDate; 
     case CompareOperator.LesserOrEqual:      
      return leftDate <= rightDate; 
     default: 
      return false; 
    } 
} 

Поскольку это атрибут AttriuteTargets.Class Я знаю, что это невозможно рамки, чтобы знать, какое свойство, которое вызывает проверка на провал. Но я знаю, что это свойство Left Date, которое терпит неудачу, и поэтому я хочу установить Id ошибки в modelstate для этого свойства. Причина этого в том, что я хочу, чтобы поле ошибки было отмечено в форме.

Вопрос: Как изменить элемент ошибки, добавленный в коллекцию ошибок в ModelState, чтобы его идентификатор соответствовал определенному полю в форме?

ответ

-1

Я нашел лучший способ сделать это с помощью IDataErrorInfo

Вот как я это делаю. Это не так, как пример в вопросе. С помощью этого решения вам нужно запрограммировать каждую проверку. Но теперь валидация будет работать хорошо вплоть до javascript и подсветки входного элемента с ошибкой.

public class TestModel: IDataErrorInfo 
{ 

    public TestModel() 
    { 
    } 

    [Required] 
    public string StartDate { get; set; } 

    [Required] 
    public string EndDate { get; set; } 

    #region IDataErrorInfo Members 

    public string Error 
    { 
     get 
     { 
      return string.Empty; 
     } 
    } 

    public string this[string columnName] 
    { 
     get 
     { 
      switch (columnName) 
      { 
       case "StartDate": 
        { 
         if (StartDate < DateTime.Today) 
         { 
          return "Start date must not be a date in the past"; 
         } 
         break; 
        } 
       case "EndDate": 
        { 
         if (EndDate < StartDate) 
         { 
          return "End date must not be a date before start date"; 
         } 
         break; 
        } 
       default: 
        return string.Empty; 
      } 
      return string.Empty; 
     } 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^