|
jQuery插件很多,其中一個重要的插件便是jQuery Validation,它的作用是對表單進(jìn)行驗證,還上了jQuery官網(wǎng)。不過奇怪的是,最近用下來感覺有些古怪,因為好像有些死板,已有功能的應(yīng)變能力還不強(qiáng),甚至還有個奇怪的Bug。任何項目有Bug其實(shí)也正常,但這個Bug其實(shí)是一個文檔上已經(jīng)記載了,卻沒有實(shí)現(xiàn)的功能,這就有些說不過去了。這個問題便出在remote驗證方式上,還好修改起來非常容易,在此記錄一下,也方便以后的參考。
在表單驗證時,有時候會需要發(fā)一個AJAX請求去服務(wù)器上進(jìn)行判斷,例如在用戶注冊時檢查用戶名是否存在。jQuery Validation插件提供了一種remote方式來實(shí)現(xiàn)這一點(diǎn)。例如我可以這樣驗證表單:
<form id="regForm"> <input type="text" name="userName" />form><script language="Javascript"> $('#regForm').validate({ 'rules': { 'userName': { 'required': true, 'remote': '/account/verify' }});script>
這樣,jQuery Validation便會請求“/account/verify?userName=jeffz”這樣的URL來獲取true/false。可惜的是,我們在使用ASP.NET MVC時,往往會將input的name寫為特定的形式,目的是利用DefaultModelBinder的強(qiáng)大綁定功能。例如:
<form id="regForm"> <input type="text" id="userName" name="user.Name" />form>
與此同時,我們用來進(jìn)行驗證的Action方法,它的參數(shù)名可能也有所不同:
public ActionResult Verify(string name) { ... }
根據(jù)文檔描述,此時我們應(yīng)該這樣寫:
$('#regForm').validate({ 'rules': { 'user.Name': { 'remote': { url: '/account/verify', data: { name: function() { return $("#userName").val(); } }}}}});
可是,從實(shí)際效果來看,jQuery還是在請求“/account/verify?user.Name=jeffz”,百思不得其解。確認(rèn)在三之后只得求助于jquery.validation.js源碼,看后差點(diǎn)暈過去:
remote: function(value, element, param) { if ( this.optional(element) ) return "dependency-mismatch"; ... param = typeof param == "string" && {url:param} || param; if ( previous.old !== value ) { previous.old = value; var validator = this; this.startRequest(element); var data = {}; data[element.name] = value; // data還是以element.name為準(zhǔn)? $.ajax($.extend(true, { url: param, mode: "abort", port: "validate" + element.name, dataType: "json", data: data, success: function(response) { ...
我很奇怪,不知道為什么會這樣做,這樣根本沒有起到指定參數(shù)名的作用。那么,改吧:
remote: function(value, element, param) { if (this.optional(element)) return "dependency-mismatch"; ... param = typeof param == "string" && {url:param} || param; if (previous.old !== value) { previous.old = value; var validator = this; this.startRequest(element); var data = {}; data[element.name] = value; $.ajax($.extend(true, { // url: param, url: param.url, mode: "abort", port: "validate" + element.name, dataType: "json", // data: data, data: param.data || data, success: function(response) { ...
修改兩處即可,問題就此解決。只可惜,jquery.validate.min.js類似的文件只能自己進(jìn)行壓縮了。
居然會出現(xiàn)這樣的問題,實(shí)在令人費(fèi)解。
it知識庫:jQuery Validation插件remote驗證方式的Bug,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。