2014-10-10 3 views
1

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

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

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

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

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

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

метод управления:

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

Вы вручную изменяете значение AllowAnyPlan от фактического опубликованного значения? –

+0

@ ErikFunkenbusch no. Я устанавливаю точку останова в открывающей скобке моего метода контроллера – DLeh

+0

@ErikFunkenbusch Я даже пытался изменить 'AllowAnyPlan' на то, чтобы читать только как« истинный », и все равно это происходит – DLeh

ответ

1

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

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

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

+0

А, это объясняет! Я все еще новичок в MVC, поэтому я не знал об этом. Меняя его на 'int? 'И инициализируя значение 0, мне нужны результаты. Хотя мне придется добавить некоторые '' 'ко всему обратно в' int', но это нормально. Благодаря! – DLeh

+0

На самом деле, это дает мне проблему. значение теперь получает значение «null» в качестве значения по умолчанию, которое закручивает привязку в моем выпадающем списке после обратной передачи. Я инициализирую значение 0 в конструкторе модели, но после обратной передачи он получает значение «null», поэтому в раскрывающемся списке ничего нет ничего, кроме первого элемента в раскрывающемся списке. любое понимание? – DLeh

+0

@DLeh - 0 удовлетворяет требованиям, вы не можете использовать значение и использовать его. Поэтому, если ваш код требует наличия значения, но вы хотите, чтобы значение было необязательным, у вас есть дилемма, чтобы понять. Это похоже на то, что вы действительно хотите, это «zero if true» not «required if true» –