MVC Foolproof Validation RequiredIfFalse неправильно возвращает ошибку

Я использую библиотеку MVC Foolproof Validation для создания зависимых требований:

public bool IsRequired { get; set; }
[RequiredIfTrue("IsRequired", ErrorMessage = "This field is required")]
public int RequiredIfTrueSelectID { get; set; }

Это отлично работает на стороне клиента, позволяя мне отправить форму без значения RequiredIfTrueSelectID (т. е. значение равно 0), но на [HttpPost] ModelState.IsValid возвращает false и со следующим результатом в непосредственном окне:

myViewModel.IsRequired 
   true
ModelState["RequiredIfTrueSelectID"].Errors[0]
  {System.Web.Mvc.ModelError}
    ErrorMessage: "A value is required."
    Exception: null

Я гарантирую, что отправляю обратно значение RequiredIfTrueSelectID (как вы можете видеть в первом непосредственном запросе окна выше). Почему я получаю сообщение «Требуется значение» и как подавить эту ошибку?

Кстати, я в MVC5. Может быть, реализация ModelState изменилась с момента последнего обновления Foolproof 2 года назад? Кто-нибудь еще знает о недавно опубликованной библиотеке, которая работает как Foolproof?

Метод контроллера:

[HttpPost]
public virtual ActionResult ValidationTest(TestViewModel vm)
{ //breakpoint here to check ModelState.IsValid
    return View(vm); 
}

person DLeh    schedule 10.10.2014    source источник
comment
Вы вручную меняете значение AllowAnyPlan по сравнению с фактически опубликованным значением?   -  person Erik Funkenbusch    schedule 10.10.2014
comment
@ErikFunkenbusch нет. Я устанавливаю точку останова в открывающей фигурной скобке моего метода контроллера   -  person DLeh    schedule 10.10.2014
comment
@ErikFunkenbusch Я даже пытался изменить AllowAnyPlan на true только для чтения, и это все еще происходит.   -  person DLeh    schedule 10.10.2014
comment
Я обнаружил, что если я повторно запускаю проверку ModelState.Clear(); ValidateModel(myViewModel);, она работает правильно, так что на данный момент это обходной путь, но я не хочу вызывать это каждый раз.   -  person DLeh    schedule 10.10.2014
comment
Что такое валидатемодель? Вы имеете в виду UpdateModel?   -  person Erik Funkenbusch    schedule 10.10.2014
comment
ValidateModel() на контроллере: msdn.microsoft.com/en-us/library/   -  person DLeh    schedule 10.10.2014
comment
Правильно, заморозить мозги. Как выглядит ваш метод контроллера, включая параметры?   -  person Erik Funkenbusch    schedule 10.10.2014
comment
Я обновил вопрос, чтобы показать мой метод контроллера.   -  person DLeh    schedule 10.10.2014


Ответы (1)


О, да. Ваше поле является типом значения.

Типы значений требуются всегда. Вам нужно сделать тип обнуляемым, если вы хотите, чтобы он был необязательным.

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

person Erik Funkenbusch    schedule 10.10.2014
comment
А, это объясняет! Я все еще новичок в MVC, поэтому я не знал об этом. Изменение его на int? и инициализация значения 0 дает мне нужные мне результаты. Хотя мне придется добавить немного ?? ко всему обратно к ints, но ничего страшного. Спасибо! - person DLeh; 10.10.2014
comment
На самом деле, это создает мне проблему. значение теперь получает null в качестве значения по умолчанию, что портит привязку в моем раскрывающемся списке после обратной передачи. Я инициализирую значение 0 в конструкторе модели, но после обратной передачи оно устанавливается на null, поэтому в моем раскрывающемся списке ничего не отображается вместо первого элемента в раскрывающемся списке. любое понимание? - person DLeh; 10.10.2014
comment
@DLeh - 0 удовлетворяет требуемому, вы не можете иметь значение и использовать обязательное .. поэтому, если ваш код требует, чтобы значение было, но вы хотите, чтобы значение было необязательным, у вас есть дилемма, которую нужно решить. Похоже, то, что вы действительно хотите, равно нулю, если это правда, не требуется, если это правда - person Erik Funkenbusch; 10.10.2014
comment
Думаю, я надеюсь на Разрешить ноль, если ложь, или Запретить ноль, если правда. Кроме того, поскольку я использую это в раскрывающемся списке, 0, похоже, не удовлетворяет требованиям. Это то, что я хочу, условно. - person DLeh; 10.10.2014
comment
В любом случае, я могу просто обнаружить значение null в раскрывающемся списке и заменить его на javascript равным 0. Я сомневаюсь, что разрешить или запретить ноль будет достижимо. Спасибо еще раз за помощь! - person DLeh; 10.10.2014
comment
@DLeh - в любом случае вам, вероятно, не следует использовать значение 0 по умолчанию, вы должны использовать нулевое значение по умолчанию и использовать параметр параметра по умолчанию для DropDownListFor, чтобы установить текст, который отображается для этого. - person Erik Funkenbusch; 10.10.2014
comment
Это то, что я делаю. Параметр по умолчанию не отображается, когда предоставляется null, он просто показывает пустую запись, которая исчезает после выбора другого значения, а под ней отображается любая запись. Я хочу, чтобы эта запись была выбрана по умолчанию. По-видимому, установка раскрывающегося списка в значение null отличается от установки его в 0 или ''. По сути, я хочу, чтобы все, что он обычно делает с 0, кроме возможности пометить его как недопустимое в определенной ситуации. - person DLeh; 10.10.2014
comment
@DLeh - Нет, есть параметр optionLabel, который отображается, когда значение равно null. Это будет для вашего выбора значения или любого или того, что вы хотите по умолчанию. Вы не используете значение 0. - person Erik Funkenbusch; 11.10.2014
comment
Хм, ладно, может быть, я имею в виду другой параметр. Я посмотрю на это. Спасибо! - person DLeh; 11.10.2014