2012-06-28 2 views
1

У меня есть форма, которая отображается с информацией о клиенте. Существует раскрывающийся список, который при изменении вставляет новые элементы формы в HTML с JavaScript. Я получил JavaScript для проверки после этого события.MVC 3 проверка бритвы после обратной передачи

Когда я отправляю форму, я получаю массив новых элементов в моей модели. Если теперь я проверяю сервер и возникает ошибка, я возвращаю все обратно в представление, генерируя на этот раз новые элементы, используя бритву. Все хорошо до сих пор. Однако проверка на стороне клиента не работает! Я получаю подтверждение для других элементов в форме, но не для тех, которые были созданы из коллекции, которые были добавлены вручную ранее.

Я вижу, что атрибутов data-val не существует для массива элементов.

Если представление отображается вместе, включая цикл для массива значений, почему я не получаю проверку клиента в этом разделе формы?

@{if (Model.pasajeros != null) 
     { 
      for (int i = 0; i < Model.pasajeros.Count(); i++) 
      { 
      <p>Pasajero: @(i + 1)</p> 
      <table> 
       <tr> 
        <td><span class="lblspan">Nombre</span></td><td><span class="lblspan">Primer Apellido</span></td><td><span class="lblspan">Segundo Apellido</span></td> 
       </tr> 
       <tr> 
       <td>@Html.TextBoxFor(x => x.pasajeros[i].name, new { @class = "txtboxsmall" })<br />@Html.ValidationMessageFor(x => x.pasajeros[i].name)</td> 
       <td>@Html.TextBoxFor(x => x.pasajeros[i].lname, new { @class = "txtboxsmall" })<br />@Html.ValidationMessageFor(x => x.pasajeros[i].lname)</td> 
       <td>@Html.TextBoxFor(x => x.pasajeros[i].lname2, new { @class = "txtboxsmall" })<br />@Html.ValidationMessageFor(x => x.pasajeros[i].lname2)</td> 
       </tr> 
       <tr> 
        <td><span class="lblspan">Fecha de Nacimiento (mm/dd/yyyy)</span></td><td style="vertical-align: bottom"><span class="lblspan">Sexo</span></td><td></td> 
       </tr> 
       <tr> 
        <td>@Html.TextBoxFor(x => x.pasajeros[i].dob, new { @class = "txtboxsmall" })<br />@Html.ValidationMessageFor(x => x.pasajeros[i].dob)</td> 
        <td>@Html.DropDownListFor(x => x.pasajeros[i].sex, Model.sexoItems, new { @class = "ddlsmall" })</td><td></td> 
       </tr> 

      </table> 

     <p>@Html.RadioButtonListFor(x => x.pasajeros[i].radioselect, Model.radioItems) </p> 

     <table> 
      <tr> 
      @if (Model.pasajeros[i].radioselect == "pass") 
      { 
      <td style="vertical-align: bottom"><span class="lblspan" id="@("numeroA" + i.ToString())">Número de Pasaporte Americano</span><span id="@("numeroR" + i.ToString())" class="statehide">Número de Residencia</span></td> 
      } 
      else 
      { 
      <td style="vertical-align: bottom"><span class="statehide" id="@("numeroA" + i.ToString())">Número de Pasaporte Americano</span><span id="@("numeroR" + i.ToString())" class="lblspan">Número de Residencia</span></td> 
      } 
      <td style="vertical-align: bottom"><span class="lblspan">Fecha de Vencimiento</span></td> 
      <td><span class="lblspan">Número de Pasaporte Cubano</span></td><td style="vertical-align: bottom"><span class="lblspan">Fecha de Vencimiento</span></td> 
      </tr> 
      <tr> 
       @if (Model.pasajeros[i].radioselect == "pass") 
       { 


       <td>@this.TextBox(x => x.pasajeros[i].numAmericanPassport).Id("numAmericanPassport" + i).Class("txtboxsmall") 

       @this.TextBox(x => x.pasajeros[i].numResidencia).Id("numResidencia" + i).Class("statehide").Disabled(true) 
       <br /> @Html.ValidationMessageFor(x => x.pasajeros[i].numAmericanPassport) @Html.ValidationMessageFor(x => x.pasajeros[i].numResidencia)</td> 
       <td> 
       @this.TextBox(x => x.pasajeros[i].expAmericanPassport).Id("expAmericanPassport" + i).Class("txtboxsmall") 

       @this.TextBox(x => x.pasajeros[i].expResidencia).Id("expResidencia" + i).Class("statehide").Disabled(true) 
       <br /> @Html.ValidationMessageFor(x => x.pasajeros[i].expAmericanPassport) @Html.ValidationMessageFor(x => x.pasajeros[i].expResidencia)</td> 
       } 
       else 
       { 
       <td>@this.TextBox(x => x.pasajeros[i].numAmericanPassport).Id("numAmericanPassport" + i).Class("statehide").Disabled(true) 

       @this.TextBox(x => x.pasajeros[i].numResidencia).Id("numResidencia" + i).Class("txtboxsmall") 
       <br /> @Html.ValidationMessageFor(x => x.pasajeros[i].numAmericanPassport) @Html.ValidationMessageFor(x => x.pasajeros[i].numResidencia)</td> 
       <td> 
       @this.TextBox(x => x.pasajeros[i].expAmericanPassport).Id("expAmericanPassport" + i).Class("statehide").Disabled(true) 

       @this.TextBox(x => x.pasajeros[i].expResidencia).Id("expResidencia" + i).Class("txtboxsmall") 
       <br /> @Html.ValidationMessageFor(x => x.pasajeros[i].expAmericanPassport) @Html.ValidationMessageFor(x => x.pasajeros[i].expResidencia)</td> 
       } 
       <td>@Html.TextBoxFor(x => x.pasajeros[i].numCubanPassport, new { @class = "txtboxsmall" })</td> 
       <td>@Html.TextBoxFor(x => x.pasajeros[i].expCubanPassport, new { @class = "txtboxsmall" })</td> 
      </tr> 
      <tr> 
       <td><span class="lblspan">Habilitación</span></td><td><span class="lblspan">Documento</span></td><td colspan="2"></td> 
      </tr> 
      <tr> 
       <td>@Html.TextBoxFor(x => x.pasajeros[i].visa, new { @class = "txtboxsmall" })</td> 
       <td colspan="3"><input type="file" name="documents[@i]" /></td> 
      </tr> 
     </table> 
     <hr /> 
     } 
    } 

}

Это часть моего зрения

+0

Вам нужно будет показать код. Особенно бит, который выполняет нерабочую часть проверки (бот-клиент и части сервера). Но публикуйте только соответствующие биты, а не весь файл. –

+0

Это довольно распространенная проблема с проверкой jQuery динамических элементов. –

+0

Я выяснил, что это происходит только с элементами управления FluentHTML ..? Кто-нибудь знает причину? –

ответ

1

Вам нужно вызвать метод parse после того, как вы добавили новые элементы в DOM, чтобы зарегистрировать их с ненавязчивой проверки:

$.validator.unobtrusive.parse('#id_of_the_form_containing_newly_added_inputs'); 

Очевидно, что эти элементы должны иметь соответствующие атрибуты HTML5 data-*, которые указывают правила проверки, которые вы хотите примените к ним, так же, как и добавленные на сервере входы.

Смежные вопросы