1

顧客情報でレンダリングされたフォームがあります。変更すると、JavaScriptを使用してHTMLに新しいフォーム要素を挿入するドロップダウンがあります。このイベントの後に検証するためのJavaScriptを入手しました。

フォームを投稿すると、新しい要素の配列がモデルに取り込まれます。サーバーの検証を行ってエラーが発生した場合は、すべてをビューに戻し、今度はかみそりを使用して新しい要素を生成します。これまでのところすべて良い。ただし、クライアント側の検証は機能していません。フォーム内の他の要素の検証は取得しますが、以前に手動で追加されたコレクションから生成された要素の検証は取得しません。

要素の配列に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 />
      }
  }

}

それは私の見解の一部です

4

1 に答える 1

1

parse新しい要素を DOM に追加した後、目立たない検証でそれらを登録するためにメソッドを呼び出す必要があります。

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

明らかに、これらの要素data-*には、サーバーに追加された入力と同じように、適用する検証ルールを示す対応する HTML5 属性が必要です。

于 2012-06-29T05:54:05.450 に答える