Что мне не хватает в этом приложении ASP.NET MVC 3, чтобы получить ненавязчивую проверку на стороне клиента? - PullRequest
2 голосов
/ 01 сентября 2011

Мне нужна помощь в выяснении того, как успешно реализовать ненавязчивую проверку поля на стороне клиента в моем приложении ASP.NET MVC 3.Я вижу, что ненавязчивая проверка на стороне клиента в основном включена , поскольку MVC генерирует связанный HTML.

В этом случае я хочу добиться проверки ввода в Bugsредактор (т. е. соответствующий элемент <input>) при вводе, для целей тестирования я установил максимальную длину свойства равной 2. При тестировании я могу сказать, что проверка в настоящее время не выполняется, поэтому что-то по крайней мере не хватает, Итак, критерием успеха для этого вопроса является проверка на стороне клиента поля формы Bugs .

Я вижу одну возможную проблему в сгенерированном HTML: свойство Verbose не помечен как Required в модели, но соответствующий ему <input> по-прежнему получает атрибут dataval=true, например, , тогда как <input> для Bugs не ,Не должно ли быть наоборот, поскольку поля с правилами проверки должны получить dataval=true, чтобы включить ненавязчивую проверку?

Код, который должен иметь отношение к пониманию случая, следует, пожалуйста, дайте мне знать, если большетребуется информация:

Options.cs:

public class Options
{
    [Required, StringLength(2)]
    public string Bugs;
    public bool Verbose;
}

Options.cshtml:

<script src="@Url.Content("~/Scripts/jquery-1.6.2.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

<div id="options-form">
  @using (Html.BeginForm())
  {
    @Html.ValidationSummary(true)
    <fieldset>
      <legend>Options</legend>
      <div class="editor-label">
        @Html.LabelFor(model => model.Bugs)
      </div>
      <div class="editor-field">
        @Html.EditorFor(model => model.Bugs)
        @Html.ValidationMessageFor(model => model.Bugs)
      </div>
      <div class="editor-label">
        @Html.LabelFor(model => model.Verbose)
      </div>
      <div class="editor-field">
        @Html.CheckBoxFor(model => model.Verbose)
        @Html.ValidationMessageFor(model => model.Verbose)
      </div>
   </fieldset>
  }
</div>

Два редактора (для Bugs и Verbose):представляется следующим образом:

<div id="options-form">
<form action="/Options" method="post">
  <fieldset>
    <legend>Options</legend>
      <div class="editor-label">
        <label for="Bugs">Bugs</label>
      </div>
      <div class="editor-field">
        <input class="text-box single-line" id="Bugs" name="Bugs" type="text" value="" />
        <span class="field-validation-valid" data-valmsg-for="Bugs" data-valmsg-replace="true"></span>
      </div>
      <div class="editor-label">
        <label for="Verbose">Verbose</label>
      </div>
      <div class="editor-field">
        <input data-val="true" data-val-required="The Boolean field is required." id="Verbose" name="Verbose" type="checkbox" value="true" /><input name="Verbose" type="hidden" value="false" />
        <span class="field-validation-valid" data-valmsg-for="Verbose" data-valmsg-replace="true"></span>
      </div>
    </fieldset>
  </form>
</div>

Ответы [ 3 ]

4 голосов
/ 01 сентября 2011

Bugs и Verbose являются открытыми полями в этом коде, а не свойствами. Сделайте их свойства, и это должно исправить это.

2 голосов
/ 01 сентября 2011

Определите get; и set; для свойств Bugs и Verbose. Это не только исправит (добавит) валидацию, но в будущем механизм связывания моделей сможет связывать модели обратно с полей формы на сервере.

И относительно обязательного атрибута для Verbose. Это происходит из-за неявной обязательной проверки для типов значений. Строка имеет значение nullable, поэтому она не требуется, если вы не установили для нее атрибут Required явно - поэтому ошибки остаются без необходимости. Но bool не может быть null по природе c #, поэтому mvc автоматически добавляет к нему атрибут Required. Вы можете контролировать это с помощью

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
0 голосов
/ 01 сентября 2011

Недавно я столкнулся с той же проблемой (ненавязчивая проверка на стороне клиента не работала в IE, но работала в других браузерах). Причина была в версии jQuery. Я откатился с версии jQuery 1.6.x до версии 1.5.2 и он начал работать.

...