【发布时间】:2012-06-28 22:23:50
【问题描述】:
我有一个带有客户信息的表单。有一个下拉菜单,在更改时会使用 JavaScript 在 HTML 中插入新的表单元素。在此事件之后,我得到了用于验证的 JavaScript。
当我发布表单时,我确实将新元素数组放入我的模型中。如果现在我进行服务器验证并且出现错误,我会将所有内容返回到视图,这次使用 razor 生成新元素。到目前为止一切都很好。但是客户端验证不起作用! 我确实对表单中的其他元素进行了验证,但对之前手动添加的从集合生成的元素没有验证。
我确实看到元素数组没有 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 />
}
}
}
这是我的观点
【问题讨论】:
-
你必须展示一些代码。特别是执行验证的无效部分(机器人客户端和服务器端部分)的位。但只发布相关位,而不是整个文件。
-
这是 jquery 验证动态元素的一个很常见的问题。
-
我发现只有 FluentHTML 控件才会发生这种情况..?有人知道原因吗?
标签: asp.net-mvc asp.net-mvc-3 validation razor