2011-11-09 105 views
4

我正在使用MVC3客戶端驗證。有一種方法可以在驗證器啓動後運行一次函數?驗證完成後mvc3驗證功能運行

理想我想settngs.errorPlacement運行,並相應地把我的錯誤,一旦完成我想另一個函數只運行一次。目前我正在從settngs.errorPlacement中調用該函數,並且它運行的每個錯誤都會影響性能。

感激地收到任何幫助。

更新

當MVC不顯眼的客戶端驗證火災,每個校驗器將調用無論是成功還是errorPlacement功能。基本上,如果我在頁面上有15個驗證器,這些函數中的任何一個都會爲每個驗證器運行(即,7次成功,8次錯誤或5次成功,10次錯誤)。我想要做的就是調用一個函數,在驗證器循環後運行一次,並且成功和errorPlacement函數已經完成了位...

我在此刻調用函數15次,因爲我無法弄清楚我可以在哪裏只能運行一次的功能。

+0

至少對我來說,它不是很清楚你想要做什麼。你可以添加一個代碼示例或澄清一點? –

+0

更新補充 - 希望這是一個更清晰的解釋! – Sniffer

回答

1

他們沒有這個選項,但你可以通過重寫現有的功能form或類似的東西去做。

var originalForm = $.validator.prototype.form; 
$.validator.prototype.form = function() { 
    var returnValue = originalForm.call(this); 
    if(!returnValue) { 
     //do my custom invalid handling here 
    } 
    return returnValue; 
} 

我沒有測試此代碼,我會盡量把一個小提琴,但我沒有什麼不顯眼的實現看起來就像在MVC3因爲我已經沒有使用它肯定100%。如果你可以用你的輸出HTML/JS的模型來搞定,我們可能會想出來。

+0

很酷。它在我有限的測試中使用標準的'Html.BeginForm()'表單和一個Ajax.BeginForm(...)'AJAX表單,並帶有不顯眼的JS。它不會干擾'submit'處理程序,所以不需要擔心bind()'''unbind()','live()'/'die()','delegate() /'undelegate()',或者on()''off()'事件處理程序。 – nekno

1

我會建議更換defaultShowErrors功能jquery.validate.js,鏡像它,並添加到您的位置函數的調用。在驗證運行後調用defaultShowErrors,無論是單個元素還是整個表單。

以下內容添加到JavaScript文件(後 jquery.validate.js插入),或在您的網頁上的腳本:

$.extend($.validator.prototype, { 
    defaultShowErrors: function() { 
     for (var i = 0; this.errorList[i]; i++) { 
      var error = this.errorList[i]; 
      this.settings.highlight && this.settings.highlight.call(this, error.element, this.settings.errorClass, this.settings.validClass); 
      this.showLabel(error.element, error.message); 
     } 
     if(this.errorList.length) { 
      this.toShow = this.toShow.add(this.containers); 
     } 
     if (this.settings.success) { 
      for (var i = 0; this.successList[i]; i++) { 
       this.showLabel(this.successList[i]); 
      } 
     } 
     if (this.settings.unhighlight) { 
      for (var i = 0, elements = this.validElements(); elements[i]; i++) { 
       this.settings.unhighlight.call(this, elements[i], this.settings.errorClass, this.settings.validClass); 
      } 
     } 
     this.toHide = this.toHide.not(this.toShow); 
     this.hideErrors(); 
     this.addWrapper(this.toShow).show(); 

     // INSERT CALL TO YOUR CUSTOM PLACEMENT FUNCTION HERE 
    } 
}); 
4

jQuery的驗證插件鉤與事件處理程序的形式submit事件它調用其validate()函數在提交之前驗證表單,從而防止在驗證失敗時提交表單。

如果您使用jQuery爲每個表單掛接了submit事件,並在表單底部執行它,它將添加您自己的處理程序在插件處理程序之前執行。這樣,您可以自己調用表單上的valid()函數,並在完成表單驗證之後運行您想要的任何自定義代碼。插件的valid()函數調用窗體上的validate()函數,然後返回一個布爾值表示成功/失敗。如果您不關心成功/失敗,則可直接致電validate()而不是致電valid()

當您在表單上調用valid()validate()時,它將繼續使用MVC3不顯眼的客戶端驗證來標記帶有驗證錯誤的表單,但現在您可以在調用後執行其他操作。

我在我自己的submit()處理程序(下面)和jQuery驗證插件validate()valid()函數中放置了斷點。我只看到他們在此實現中調用一次,因此您對完整表單的驗證不應執行多次。當然,插件也會鉤住焦點,模糊,鍵入和點擊事件,因此單個字段的驗證器已經被設計多次調用,所以用戶可以立即獲得對失敗/解析表單字段的反饋。驗證是懶惰的,因爲它不會運行,直到用戶在字段中輸入值。一旦用戶輸入值並離開該字段,該字段將被驗證。如果一個字段被標記爲無效,則重新驗證是急切的,因爲對於各種事件重複驗證無效字段,直到它被發現有效。

在頁面底部放置以下內容,全部低於form標籤。正如所寫的,使用$("form")選擇器,它將處理頁面上所有form元素的提交事件。當然,您可以使用jQuery選擇器來挑選特定的form標籤進行驗證。每當您要執行驗證時,請在表單上撥打valid()validate(),然後按照您希望執行的任何代碼進行驗證。

獲得的驗證結果:

<form> 
... 
</form> 

<script type="text/javascript"> 
    $("form").submit(function (e) { 
     if ($(this).valid() == false) { 
      alert("yo!"); // execute anything you want following validation 
     } 
    }); 
</script> 

或者,如果你不小心知道驗證的結果:

<script type="text/javascript"> 
    $("form").submit(function (e) { 
     $(this).validate(); 
     alert("yo!"); // execute anything you want following validation 
    }); 
</script> 
+0

+1這是迄今爲止最簡單的方法。 – Olivier

-1

[SessionState(SessionStateBehavior.Default)]你上面類的定義,然後檢查if (Session.IsNewSession == true)所以它只是第一次運行。 或者你可以設置Session["somevariable"] = "somevalue"當你想要超越你的功能,並檢查if (Session["somevariable"] == "somevalue")。如果你的功能應該被執行,那麼你可以輕鬆切換。

+0

Sniffer正在尋找客戶端驗證後或客戶端事件在瀏覽器中運行的客戶端函數。 C#服務器代碼不適用。 – nekno