У меня есть модель (упрощенный) следующим образом:ASP.NET MVC модель привязки и проверки заказа
public UserModel {
...
public USState State {get; set; }
public string StateString {get; set; }
public Country Country {get; set; }
...
}
правила проверки мне нужны:
- Если
Country
является США затемState
необходимо. - Если
Country
не является США, тоStateString
не требуется.
Я создал специальный атрибут проверки RequiredIfAttribute
. Это работает отлично, поэтому я не собираюсь заполнять вопрос с его реализацией. Он имеет три обязательных элемента:
CompareField
- Это поле, которое оно будет использовать для проверки того, требуется ли подтверждение.CompareValue
- Это значение, которое будет сравниваться с тем, чтобы решить, требуется ли подтверждение.CompareType
- Вот как он будет сравнивать значение, чтобы решить, требуется ли проверка.
Так с этим, я обновить мою модель, как, например:
public UserModel {
...
[RequiredIf("Country", Country.USA, EqualityType.Equals)]
public USState State {get; set; }
[RequiredIf("Country", Country.USA, EqualityType.NotEquals)]
public string StateString {get; set; }
[Required]
public Country Country {get; set; }
...
}
Здесь я должен отметить, что моя также имеет проверки на стороне клиента RequiredIfAttribute
. Это прекрасно работает.
Теперь о проблеме ...
Я вывешиваю следующие значения:
State = AL
StateString = нуль
Страна = США
Это соответствует моим правилам проверки и должно быть действительным. Вот , но. ModelState
говорит мне, что это неверно. По-видимому, поле StateString требуется. Это не то, что я указал. Почему мои правила валидации не применяются, как ожидалось?
(Если вы знаете, что случилось в этот момент, то не чувствую себя обязанным прочитать остальную часть вопроса)
Итак, вот что происходит. RequiredIfAttribute
запускается три раза. Но подождите, я использую его только дважды.Она в настоящее время запускается следующим образом:
- Trigger на
StateString
(это возвращается недопустимого) - Trigger на
State
(это возвращается действительного) - Trigger на
StateString
(это возвращается действует)
Это довольно странно. Он проверяет StateString
дважды, первый раз, когда он проходит, второй раз он терпит неудачу. Участок утолщается ...
Я посмотрел на это дальше, чтобы найти, что первый раз он пытается проверить StateString
, Country
не множества. Второй раз он пытается подтвердить StateString
, Country
is set. Похоже, что первая попытка проверки StateString
произошла до того, как моя модель была полностью привязана. Все свойства (не указаны в образце модели), которые ниже StateString
(в коде) не связаны. Вторая попытка проверки StateString
, все свойства связаны.
Я решил проблему, но я не уверен в этом, потому что я просто не доверяю ей. Для того, чтобы получить мое подтверждение работать, как и ожидалось, я переставить модель, так как такие (атрибуты удалены для краткости):
public UserModel {
...
public Country Country {get; set; }
public USState State {get; set; }
public string StateString {get; set; }
...
}
RequiredIfAttribute
все еще вызывает в три раза выше, но ModelState
говорит мне, что отправленные данные (как выше) теперь действительный, как волшебство!
Что я вижу это это (мои предположения):
1. Start binding (property by property, top to bottom in code (risky))
2. Arrive at `StateString` and decide to try and validate
3. Finish binding
4. Validate all properties
У меня действительно есть два вопроса:
1. Почему такое поведение выставлялись?
2. Как я могу остановить это поведение?
Как вам удалось решить эту проблему? –