.Net MVC2 Как добавить ошибку в ModelState при использовании пользовательского атрибута ValidationAttribute - PullRequest
0 голосов
/ 01 июля 2010

У меня есть следующий класс 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 Оператор 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, так, чтобы его идентификатор соответствовал определенному полю в форме?

1 Ответ

0 голосов
/ 02 июля 2010

Я нашел лучший способ сделать это, используя 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;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...