Пользовательский аннотации данных Custom Validator не работает (как я ожидал) в MVC2 - PullRequest
2 голосов
/ 19 мая 2011

Прежде чем я начну ... Я не могу легко перенести проект в MVC3. Зв

У меня проблема в том, что я определил пользовательский атрибут валидатора для проверки максимальной и минимальной длины строкового свойства, StringLengthInRangeAttribute .

Когда контроллер вызывает ModelState.IsValid , в списке Пассажиры только проверка свойства Date выбрасывает недопустимое значение, если ничего не было предоставлено. Я предполагаю, что это означает, что моя проблема не в пользовательском валидаторе, а во всей валидации?

Обновление (дополнительная информация для ясности):

У меня есть два симптома этой проблемы:
1. Обязательный валидатор для строк не срабатывает, когда они пусты
и
2. Мой пользовательский валидатор никогда не вызывается (установленная точка останова никогда не срабатывает).

Модель:

 public class Passenger
 {
    [Required(ErrorMessageResourceType = typeof(Resources.Messages.Passenger),
        ErrorMessageResourceName = "RequireNumber")]
    public int Number { get; set; }

    [Required(ErrorMessageResourceType = typeof(Resources.Messages.Passenger),
        ErrorMessageResourceName = "RequireSurname")]
    [StringLengthInRange(MinLength = 2, MaxLength = 30, ErrorMessageResourceType = typeof(Resources.Messages.Passenger),
        ErrorMessageResourceName = "MaxLengthSurname")]
    public string Surname { get; set; }
 } 

Пользовательский валидатор:

public class StringLengthInRangeAttribute:ValidationAttribute
{
    public int MinLength { get; set; }
    public int MaxLength { get; set; }

    public override bool IsValid(object value)
    {
        if (((string)value).Length < MinLength)
        {
            return false;
        }

        if (((string)value).Length > MaxLength)
        {
            return false;
        }

        return true;
    }
}

Действие контроллера:

 public ViewResult TailorHoliday(List<SearchAndBook.Models.ViewModels.Passenger> passengers, 
        int leadPassengerIndex)
    {
        if(!ModelState.IsValid)
        {
            return View("PassengerDetails", GetBookingState(_currentSession));
        }
    //...
    return View();
   }

Любой совет приветствуется. Это первый раз, когда я использую аннотации данных, поэтому я вполне готов чувствовать себя глупо, что что-то упустил!

1 Ответ

0 голосов
/ 20 мая 2011

Если вы проверите содержимое свойства ModelState (в отладчике), вы сможете увидеть каждое свойство, которое проверяется в ModelState.Keys, и для каждого значения вы видите фактическое состояние в ModelState.Values.Если я посмотрю на ваш контроллер, вы, кажется, разместите целый список пассажиров.Вам также следует проверить, действительно ли опубликованы ваши значения (используйте Firebug или Fiddler).Возможно, ваши поля находятся за пределами формы.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...