Использование защиты от дурака и requiredif для проверки строкового поля

У меня есть следующие поля в моей модели данных:

 public bool JointAccount { get; set; }

 [RequiredIf("JointAccount", "true", ErrorMessage = "Please select a Title")]
 public string JointAccountTitle { get; set; }

 [RequiredIf("JointAccount", "true", ErrorMessage = "Please enter first name")]
 public string JointAccountFirstName { get; set; }

У меня есть следующее в моих взглядах:

<div class="form-group">
  @Html.Label("Joint Account?", htmlAttributes: new { @class = "control-label col-md-4" })
  <div class="col-md-8">
    <div class="checkbox">
      @Html.EditorFor(model => model.JointAccount)
      @Html.ValidationMessageFor(model => model.JointAccount, "", new { @class = "text-danger" })
    </div>
  </div>
</div>

<div class="form-group">
                        @Html.Label("Title", htmlAttributes: new { @class = "control-label col-md-4" })
                        <div class="col-md-8">
                            <select required style="width:100%;height:35px;border-radius:4px;padding-left:10px;" id="JointAccountTitle" name="JointAccountTitle" class="form-control input required">
                                <option value="">Please Select Title</option>
                                <option value="Mr">Mr</option>
                                <option value="Ms">Ms</option>
                                <option value="Miss">Miss</option>
                                <option value="Mrs">Mrs</option>
                                <option value="Fr">Fr</option>
                                <option value="Dr">Dr</option>
                                <option value="Prof">Prof</option>
                                <option value="Rev">Rev</option>
                                <option value="Sr">Sr</option>
                                <option value="Br">Br</option>
                            </select>
                            @Html.ValidationMessageFor(model => model.JointAccountTitle, "", new { @class = "text-danger" })
                        </div>
                    </div>

                    <div class="form-group">
                        @Html.Label("First Name", htmlAttributes: new { @class = "control-label col-md-4" })
                        <div class="col-md-8">
                            @Html.EditorFor(model => model.JointAccountFirstName, new { htmlAttributes = new { @class = "form-control" } })
                            @Html.ValidationMessageFor(model => model.JointAccountFirstName, "", new { @class = "text-danger" })
                        </div>
                    </div>

Я пытаюсь убедиться, что данные вводятся здесь, если флажок совместной учетной записи заполнен, но, похоже, он не выдает никаких ошибок проверки в текстовом поле только в раскрывающемся списке для заголовка, какие-либо идеи здесь?


person Jay    schedule 19.01.2017    source источник


Ответы (2)


Вы создаете элемент <select> вручную и не добавляете необходимые атрибуты data-val-*, требуемые jquery.validate.unobtrusive.js, чтобы добавить правила для jquery.validate.js, поэтому вы никогда не сможете получить проверку jquery для <select> (обратите внимание, что атрибут required является проверкой HTML5, а не проверкой jquery).

Если вы утверждаете, что получаете проверку свойства JointAccountTitle (раскрывающийся список), но не JointAccountFirstName (текстовое поле), это означает, что проверка на стороне клиента jquery даже не запускается. Наиболее вероятная причина заключается в том, что у вас загружены неправильные сценарии или они загружены в неправильном порядке. Тебе нужно иметь

jquery-{version}.js
jquery.validate.js
jquery.validate.unobtrusive.js
mvcfoolproof.unobtrusive.js

Чтобы получить проверку jquery для списка выбора, вам нужно добавить соответствующие атрибуты data-val- в ваш ручной html или, что еще лучше, сгенерировать выпадающий список, используя метод DropDownListFor()

@Html.DropDownListFor(m => m.JointAccountTitle, Model TitleList, "Please select title", new { @ class="form-control input })

где TitleList — это свойство IEnumerable<SelectListItem> в вашей модели представления, содержащее значения параметров

person Community    schedule 19.01.2017
comment
У меня есть jquery, чтобы убедиться, что все выборки проверяются с помощью $step.find(select:visible).each(function () { if (!$(this).valid()) { anyError = true; }}); - person Jay; 20.01.2017
comment
думаю, что мне не хватает mvcfoolproof.unobrturive.js - person Jay; 20.01.2017
comment
Ура, Стивен был новым проектом, забыл правильно разобраться с моей конфигурацией пакета, спасибо - person Jay; 20.01.2017

Недавно я столкнулся с той же проблемой. Попробуйте заменить .EditorFor() на .TextBoxFor():

@Html.TextBoxFor(model => model.JointAccountFirstName, new { htmlAttributes = new { @class = "form-control" } })

Не уверен, почему это проблема для Foolproof, но у меня это сработало.

person chambo    schedule 19.01.2017
comment
Методы EditorFor() и TextBoxFor() генерируют идентичный html (это не имеет отношения к проблеме) - person ; 20.01.2017