我有一个非常直接的形式,将个人数据呈现为表单中心的部分视图。我无法通过客户端验证来处理此表单。 我开始追逐生成的html,并提出了在标准表格和局部视图上渲染的相同模型字段。
我注意到第一次调用时正确填充了输入元素@ html.partial,以下只有在通过ajax请求重新加载partialview时才会发生。
首先是我的局部视图的标题,这是在主页上的Ajax.BeginForm中。
@model MvcMPAPool.ViewModels.EventRegistration
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function ()
{
$(".phoneMask").mask("(999) 999-9999");
});
</script>
@{
var nPhn = 0;
var dTotal = 0.0D;
var ajaxOpts = new AjaxOptions{ HttpMethod="Post", UpdateTargetId="idRegistrationSummary", OnSuccess="PostOnSuccess" };
Html.EnableClientValidation( true );
Html.EnableUnobtrusiveJavaScript( true );
}
以下是部分视图中的剃刀标记:
@Html.ValidationMessageFor(model=>Model.Player.Person.Addresses[0].PostalCode)
<table>
<tr>
<td style="width:200px;">City*</td>
<td>State</td>
<td>Zip/Postal Code</td>
</tr>
<tr>
<td>@Html.TextBoxFor(p=>Model.Player.Person.Addresses[0].CityName, new { style="width:200px;", maxlength=50 })</td>
<td>
@Html.DropDownListFor(p=> Model.Player.Person.Addresses[0].StateCode
, MPAUtils.GetStateList(Model.Player.Person.Addresses[0].StateCode))</td>
<td>
<div class="editor-field">
@Html.TextBoxFor(p=>Model.Player.Person.Addresses[0].PostalCode, new { style="width:80px;", maxlength=10 })
</div>
</td>
</tr>
</table>
以下是局部视图中的渲染字段:
<td>
<div class="editor-field">
<input id="Player_Person_Addresses_0__PostalCode" maxlength="10" name="Player.Person.Addresses[0].PostalCode" style="width:80px;" type="text" value="" />
</div>
</td>
以下是在标准视图中呈现的相同模型字段:
<div class="editor-field">
<input data-val="true" data-val-length="The field Postal/Zip Code must be a string with a maximum length of 10." data-val-length-max="10" data-val-required="Postal or Zip code must be provided!" id="Person_Addresses_0__PostalCode" maxlength="10" name="Person.Addresses[0].PostalCode" title="Postal/Zip Code is required" type="text" value="" />
<span class="field-validation-valid" data-valmsg-for="Person.Addresses[0].PostalCode" data-valmsg-replace="true"></span>
</div>
请注意,部分视图渲染在输入元素上没有data-val-xxx属性。
这是对的吗?我没有看到客户端验证如何在没有这些属性的情况下工作,或者我在这里缺少一些基本的东西?
答案 0 :(得分:18)
为了创建不显眼的验证属性,必须存在FormContext
。在局部视图的顶部添加以下内容:
if (this.ViewContext.FormContext == null)
{
this.ViewContext.FormContext = new FormContext();
}
答案 1 :(得分:9)
如果您希望数据验证标记存在,则需要位于FormContext
。因此,如果您动态生成表单的某些部分,则需要在局部视图中包含以下行:
@{ if(ViewContext.FormContext == null) {ViewContext.FormContext = new FormContext(); }}
然后,您需要确保每次添加/删除项目时动态重新绑定不引人注意的验证:
$("#form").removeData("validator");
$("#form").removeData("unobtrusiveValidation");
$.validator.unobtrusive.parse("#form");