MVC3 Razor部分视图渲染不包括数据验证属性

Sco*_*erg 11 validation partial-views razor asp.net-mvc-3

我有一个非常直接的形式,将个人数据作为部分视图呈现在表单的中心.我无法通过客户端验证来处理此表单.我开始追逐生成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 );
}
Run Code Online (Sandbox Code Playgroud)

这是部分视图中的剃刀标记:

@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>
Run Code Online (Sandbox Code Playgroud)

这是局部视图中的渲染字段:

        <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>
Run Code Online (Sandbox Code Playgroud)

这是在标准视图中呈现的相同模型字段:

        <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>
Run Code Online (Sandbox Code Playgroud)

请注意,部分视图呈现在输入元素上没有data-val-xxx属性.

它是否正确?我没有看到客户端验证如何在没有这些属性的情况下工作,或者我错过了一些基本的东西?

cou*_*ben 18

为了创建不显眼的验证属性,FormContext必须存在.在局部视图的顶部添加以下内容:

if (this.ViewContext.FormContext == null) 
{
    this.ViewContext.FormContext = new FormContext(); 
}
Run Code Online (Sandbox Code Playgroud)

  • 你的PartialView没有`@using Html.BeginForm()`或`@using Ajax.BeginForm()`声明,所以PartialView中没有`FormContext`.如果从View调用它,则会向其传递FormContext.如果从控制器中的操作调用它,则不传递FormContext.为了使它在这种情况下工作,PartialView必须实例化FormContext.这是通过在PartialView顶部的答案中添加代码块来完成的. (2认同)

daz*_*ury 9

如果你想要数据验证标签,你需要在一个FormContext.因此,如果您动态生成表单的一部分,则需要在局部视图中包含以下行:

@{ if(ViewContext.FormContext == null) {ViewContext.FormContext = new FormContext(); }}
Run Code Online (Sandbox Code Playgroud)

然后,您需要确保每次添加/删除项目时动态重新绑定不显眼的验证:

$("#form").removeData("validator");
$("#form").removeData("unobtrusiveValidation");
$.validator.unobtrusive.parse("#form");
Run Code Online (Sandbox Code Playgroud)