jQuery Validation插件remote驗證方式的Bug解決
更新時間:2010年07月01日 20:01:18 作者:
jQuery插件很多,其中一個重要的插件便是jQuery Validation,它的作用是對表單進行驗證,還上了jQuery官網(wǎng)。
不過奇怪的是,最近用下來感覺有些古怪,因為好像有些死板,已有功能的應變能力還不強,甚至還有個奇怪的Bug。任何項目有Bug其實也正常,但這個Bug其實是一個文檔上已經(jīng)記載了,卻沒有實現(xiàn)的功能,這就有些說不過去了。這個問題便出在remote驗證方式上,還好修改起來非常容易,在此記錄一下,也方便以后的參考。
在表單驗證時,有時候會需要發(fā)一個AJAX請求去服務器上進行判斷,例如在用戶注冊時檢查用戶名是否存在。jQuery Validation插件提供了一種remote方式來實現(xià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的強大綁定功能。例如:
<form id="regForm">
<input type="text" id="userName" name="user.Name" />
</form>
與此同時,我們用來進行驗證的Action方法,它的參數(shù)名可能也有所不同:
public ActionResult Verify(string name) { ... }
根據(jù)文檔描述,此時我們應該這樣寫:
$('#regForm').validate({
'rules': {
'user.Name': {
'remote': {
url: '/account/verify',
data: {
name: function() { return $("#userName").val(); }
}}}}});
可是,從實際效果來看,jQuery還是在請求“/account/verify?user.Name=jeffz”,百思不得其解。確認在三之后只得求助于jquery.validation.js源碼,看后差點暈過去:
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為準?
$.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類似的文件只能自己進行壓縮了。
居然會出現(xiàn)這樣的問題,實在令人費解。
在表單驗證時,有時候會需要發(fā)一個AJAX請求去服務器上進行判斷,例如在用戶注冊時檢查用戶名是否存在。jQuery Validation插件提供了一種remote方式來實現(xià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的強大綁定功能。例如:
<form id="regForm">
<input type="text" id="userName" name="user.Name" />
</form>
與此同時,我們用來進行驗證的Action方法,它的參數(shù)名可能也有所不同:
復制代碼 代碼如下:
public ActionResult Verify(string name) { ... }
根據(jù)文檔描述,此時我們應該這樣寫:
復制代碼 代碼如下:
$('#regForm').validate({
'rules': {
'user.Name': {
'remote': {
url: '/account/verify',
data: {
name: function() { return $("#userName").val(); }
}}}}});
可是,從實際效果來看,jQuery還是在請求“/account/verify?user.Name=jeffz”,百思不得其解。確認在三之后只得求助于jquery.validation.js源碼,看后差點暈過去:
復制代碼 代碼如下:
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為準?
$.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類似的文件只能自己進行壓縮了。
居然會出現(xiàn)這樣的問題,實在令人費解。
您可能感興趣的文章:
- jquery validation驗證身份證號,護照,電話號碼,email(實例代碼)
- jQuery.Validate 使用筆記(jQuery Validation范例 )
- jQuery 表單驗證插件formValidation實現(xiàn)個性化錯誤提示
- jQuery驗證插件validation使用指南
- jQuery Validation實例代碼 讓驗證變得如此容易
- Jquery Validation插件防止重復提交表單的解決方法
- Jquery validation remote 驗證的緩存問題解決方法
- jquery插件validation實現(xiàn)驗證身份證號等
- 修改jQuery Validation里默認的驗證方法
- jquery表單驗證插件validation使用方法詳解
相關(guān)文章
jQuery+CSS實現(xiàn)一個側(cè)滑導航菜單代碼
側(cè)滑菜單在網(wǎng)站設計中應用比較廣泛,在許多網(wǎng)站上都可以看到此種類型的菜單。本文給大家介紹jQuery+CSS實現(xiàn)一個側(cè)滑導航菜單代碼,需要的朋友參考下吧2016-05-05jquery validate添加自定義驗證規(guī)則(驗證郵箱 郵政編碼)
這篇文章主要介紹了query validate添加自定義驗證規(guī)則,可以驗證郵箱、郵政編碼等,看代碼參考使用2013-12-12jQuery使用serialize()表單序列化時出現(xiàn)中文亂碼問題的解決辦法
列化中文時出現(xiàn)中文亂碼問題,怎么回事呢?下面給大家介紹下jQuery使用serialize()序列化表單時出現(xiàn)中文亂碼問題的解決辦法,有需要的朋友參考下2016-07-07jQuery插件echarts實現(xiàn)的單折線圖效果示例【附demo源碼下載】
這篇文章主要介紹了jQuery插件echarts實現(xiàn)的單折線圖效果,結(jié)合完整實例形式分析了echarts插件繪制簡單折線圖的操作步驟與相關(guān)實現(xiàn)技巧,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下2017-03-03