2011-06-03 41 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