2012-06-12 95 views
4

這個問題最接近於asp.net mvc3框架。它起始於「如何確保使用jQuery與asp.net mvc3動態附加輸入字段的主動驗證?」然而,經過一些搜索,測試和咖啡,我碰到這個:asp.net mvc3如何實例化客戶端驗證?

function reValidate(formId) { 
$("#" + formId).removeData("validator"); 
$("#" + formId).removeData("unobtrusiveValidation"); 
$.validator.unobtrusive.parse("#" + formId); 
} 

這工作得很好。但是,我對框架實際使用的機制更加好奇。我有一個完全基於腳本生成的頁面。視圖中唯一的一個是<div>,一個<script>標記用於加載我的庫,另一個<script>用於填充<div>。在渲染一個完全動態的頁面之後,驗證是完美無瑕的。但是,如果在加載頁面以包含一些新內容之後使用頁面加載時使用的相同過程,則驗證將中斷。當然,請撥打reValidate()

但是 -

一)如何框架實例一旦頁面加載(或加載)的驗證?

b)框架的哪一部分處理它?它是mvc3部件,asp.net部件,剃鬚刀引擎還是其他部件?

回答

6

一)如何框架實例一旦頁面加載 (或加載)的驗證?

它解析DOM,尋找你的輸入字段data-*屬性,並增加了jquery.validate rules。 jQuery validate是一個客戶端驗證插件,與ASP.NET MVC無關,可以與任何服務器端框架甚至純靜態HTML一起使用。

b)框架的哪一部分處理它?它是mvc3的一部分,asp.net的零件,剃鬚刀引擎還是其他零件?

這是jquery.validate.unobtrusive.js腳本。諸如Html.TextBoxFor之類的ASP.NET MVC幫助程序僅使用模型元數據根據您用於模型的數據註釋生成具有正確data-*屬性的輸入字段。這些屬性包含所有必要的信息,以生成原生jQuery驗證規則。所以不引人注意的腳本會在ASP.NET MVC Model元數據和jquery.validate插件之間建立粘連。完成這項工作的是$.validator.unobtrusive.parse函數。這就是爲什麼當您動態修改DOM時需要手動調用它的原因 - 您正在添加/刪除需要轉換爲jquery驗證規則的屬性。不要猶豫,看看它是如何在jquery.validate.unobtrusive.js內實施的。

+0

謝謝你一如既往的高品質的答案。我對此感到好奇的原因之一是由於下拉的驗證信息不一致。當選擇一個選項時,消息不會消失。通過查看'unobtrusive.js'文件,我能夠找到'$(selector).valid()',它將重新評估一個輸入,並能夠將其納入我的解決方案的一部分。再次感謝! –

+0

與asp.net mvc 2的此主題相關的任何鏈接? – andreapier

2

它的工作原理與Darin Dimitrov在他的回答中描述的一樣,在客戶端,在服務器端,mvc渲染引擎使用爲模型提供的元數據(通常是我們放置在模型類屬性上的屬性)決定data- *屬性需要哪些數據,以及是否應該渲染它們。
如果您對更精確的答案感興趣,您可以隨時查看source code of mvc 3,以確切瞭解何時以及如何通過html助手方法讀取元數據,最終爲您創建html字符串。