2011-06-03 88 views
0

我有一个视图模型视图。MVC客户端验证上InputModel而不是视图模型

它的形式回发一个完全不同的模式。

我试图让客户验证工作。

<script type="text/javascript" src="@Url.Content("~/Scripts/jquery-1.4.4.min.js")"></script> 
    <script type="text/javascript" src="@Url.Content("~/Scripts/jquery.validate.min.js")"></script> 
    <script type="text/javascript" src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"></script> 

<add key="ClientValidationEnabled" value="true" /> 
<add key="UnobtrusiveJavaScriptEnabled" value="true" /> 

我的观点看起来像这样:

<form method="post" action="@Url.Action("Checkout")"> 
    @Html.ValidationSummary() 
    <table> 
     <tr> 
      <td>Forename:</td> 
      <td>@Html.TextBox("Forename") @Html.ValidationMessage("Forename","*")</td> 
     </tr> 
</table> 
</form> 

我得到的客户端验证创建HTML5属性,基于视图模型上输入的印象,但我没有说视图模型为它创建数据属性,以便客户端验证如何工作?

回答

0

客户端验证开箱即用的方式是,它使用传递给视图的视图模型的ModelMetadata,根据您在视图模型上使用的数据注记属性在输入字段上发出HTML5 data-*属性。如果在POST动作中使用完全不同的视图模型作为动作参数,这显然不会起作用,因为服务器端验证将依赖POST动作中的视图模型,而客户端验证将依赖于传递给视图呈现的视图模型这种形式。

我可以看到这个问题的唯一解决方案是忘记自动客户端验证并手动定义jquery.validate规则,以便它们与您在服务器上的POST操作中使用的视图模型相一致。所以,你基本上可以忘掉data-*属性,从您的网页,get into coding排除jquery.validate.unobtrusive.min.js脚本:

$(function() { 
    $('form').vaildate({ 
     rules: { 
      ... 
     }, 
     messages: { 
      ... 
     } 
    }); 
}); 
+0

感谢有道理。我只是试图扩展视图模型以包含一个新的User()类,这是我回发并将文本框更改为TextBoxFor(x => x.User.Forename),但我仍然没有得到任何客户端验证。更新:使用BeginForm似乎创建数据属性 – Jon 2011-06-03 13:24:00