ASP.NET中實現jQuery Validation-Engine的Ajax驗證

來源:互聯網
上載者:User

見:

驗證的例子:http://www.position-relative.net/creation/formValidator/

官方地址: http://www.position-absolute.com/articles/jquery-form-validator-because-form-validation-is-a-mess/

這個外掛程式支援大部分的瀏覽器,但由於有使用到了css3的陰影和圓角樣式,所以在IE瀏覽器下無法看到圓角和陰影製作效果(IE 9 支援圓角效果)。

本文主要內容是:在ASP.NET中實現AJAX驗證功能。官方給出的Ajax驗證例子是PHP的執行個體,筆者在網站查閱的資料基本都是翻譯的官網,在ASP.NET中實現普通驗證是沒有問題的。但是,不能實現Ajax驗證,這應該是個bug。筆者研究了外掛程式代碼,給出我自己的一種解決方案,要在ASP.NET實現這種效果,必須修改官方的主JS檔案,當然同學們可以根據筆者的思路進行挖掘,歡迎補充!實現效果見:

具體怎麼使用這個外掛程式,用搜尋引擎能找到很多答案,筆者在這裡簡單囉嗦一下,照顧下新同學。首先我們的下載外掛程式包,上面是官方的。
外掛程式包我們用的主要是三個檔案:
jquery.validationEngine.js //外掛程式主JS檔案
jquery.validationEngine-cn.js //驗證規則JS檔案
validationEngine.jquery.css //樣式表檔案
當然,這個外掛程式是jQuery的第三方外掛程式,所以先要應用jquery的核心庫,筆者測試jquery 1.6.1 是沒有問題的。
1.引入jquery和外掛程式js、css檔案
<link href="Scripts/Validation-Engine/css/validationEngine.jquery.css" rel="stylesheet" type="text/css" />
<script src="Scripts/jquery-1.4.1-vsdoc.js" type="text/javascript"></script>
<script src="Scripts/Validation-Engine/js/jquery.validationEngine.js" type="text/javascript"></script>
<script src="Scripts/Validation-Engine/js/languages/jquery.validationEngine-zh_CN.js" type="text/javascript"></script>
2.初始化外掛程式,在頁面head地區加入如下代碼: 複製代碼 代碼如下:$(document).ready(function() {
$("#formID").validationEngine() ; //formID是你要驗證的表單ID
})

3.添加表單元素驗證規則,常用的驗證規則上面官方地址有說明,還可以百度一下,這個不是痛點。
<input id="Text3" type="text" class="validate[required,ajax[ajaxUsers]]" />
多個驗證多逗號隔開
4.驗證觸發 複製代碼 代碼如下:$("#formID").validationEngine({
inlineValidation: false, //在這裡修改
success : false,
alidationEventTriggers:"keyup blur", //這裡增加了個keyup,也就是鍵盤按鍵起來就觸發驗證
promptPosition: "topRight", // 有5種模式 topLeft, topRight, bottomLeft, centerRight, bottomRight
failure : function() { callFailFunction() }
})

5.Ajax驗證,好了,這裡是才是問題所在,在分析問題之前我們先看下Validation-Engine主JS檔案是怎樣實現Ajax驗證的。開啟jquery.validationEngine.js檔案,Ctrl+F用尋找"$.ajax"文檔中能找到兩處,我們要修改的是第二處,見下面摺疊的官方原始碼,
官方jquery.validationEngine.js 檔案中的關鍵代碼 複製代碼 代碼如下:官方jquery.validationEngine.js 檔案中的關鍵代碼
$.ajax({
type: options.ajaxFormValidationMethod,
url: rule.url,
cache: false,
dataType: "json",
data: "fieldId=" + field.attr("id") + "&fieldValue=" + field.val() + "&extraData=" + extraData + "&" + extraDataDynamic,
field: field,
rule: rule,
methods: methods,
options: options,
beforeSend: function() {
// build the loading prompt
var loadingText = rule.alertTextLoad;
if (loadingText)
methods._showPrompt(field, loadingText, "load", true, options);
},
error: function(data, transport) {
methods._ajaxError(data, transport);
},
success: function(json) {
// asynchronously called on success, data is the json answer from the server
var errorFieldId = json[0];
//var errorField = $($("#" + errorFieldId)[0]);
var errorField = $($("input[id='" + errorFieldId +"']")[0]);
// make sure we found the element
if (errorField.length == 1) {
var status = json[1];
// read the optional msg from the server
var msg = json[2];
if (!status) {
// Houston we got a problem - display an red prompt
options.ajaxValidCache[errorFieldId] = false;
options.isError = true;
// resolve the msg prompt
if(msg) {
if (options.allrules[msg]) {
var txt = options.allrules[msg].alertText;
if (txt)
msg = txt;
}
}
else
msg = rule.alertText;
methods._showPrompt(errorField, msg, "", true, options);
} else {
if (options.ajaxValidCache[errorFieldId] !== undefined)
options.ajaxValidCache[errorFieldId] = true;
// resolves the msg prompt
if(msg) {
if (options.allrules[msg]) {
var txt = options.allrules[msg].alertTextOk;
if (txt)
msg = txt;
}
}
else
msg = rule.alertTextOk;
// see if we should display a green prompt
if (msg)
methods._showPrompt(errorField, msg, "pass", true, options);
else
methods._closePrompt(errorField);
}
}
errorField.trigger("jqv.field.result", [errorField, options.isError, msg]);
}
});

從上面官方源碼分析,這裡的AJAX驗證機制也是基於jQuery的$.AJAX()方法。為了找到外掛程式無法驗證的問題,筆者用jQuery手寫了一個$.AJAX()請求,來驗證jquery.validationEngine.js中的AJAX驗證。
5.1 第一步,建立幕後處理程式,這裡建立一般處理常式為例子,代碼如下: 複製代碼 代碼如下:public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
HttpContext _content = HttpContext.Current;
string validateId = _content.Request["fieldId"];
string validateValue = _content.Request["fieldValue"];
string validateError = _content.Request["extraData"];
string str;
if (validateValue == "abc")
str = "{\"jsonValidateReturn\":[\"" + validateId + "\",\"" + validateError + "\",true]}";
else
str = "{\"jsonValidateReturn\":[\"" + validateId + "\",\"" + validateError + "\",false]}";
context.Response.Write(str);
}

這裡注意了:在AJAX驗證的時候,會POST三個核心參數到後台,fieldId、fieldValue、extraData,當然還可自訂其它的參數傳遞過來
5.2 第二步,建立一個aspx頁面仿照Validation-Engine的JS寫個AJAX請求,代碼如下: 複製代碼 代碼如下:示範頁面
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="FormValidation.aspx.cs" Inherits="DemoWeb.FormValidation" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>jQuery表單驗證 - Validation-Engine</title>
<link href="Scripts/Validation-Engine/css/validationEngine.jquery.css" rel="stylesheet" type="text/css" />
<script src="Scripts/jquery-1.4.1-vsdoc.js" type="text/javascript"></script>
<script src="Scripts/Validation-Engine/js/jquery.validationEngine.js" type="text/javascript"></script>
<script src="Scripts/Validation-Engine/js/languages/jquery.validationEngine-zh_CN.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function () {
$("#formID").validationEngine({
ajaxFormValidation: true
});
$.ajax({
type: "get",
url: "AjaxBackstage/AjaxValidation.ashx",
cache: false,
data: { "fieldId": "Text4", "fieldValue": "haha", "extraData": "nowtime2012" },
dataType: "json",
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert("錯誤!XMLHttpRequest.status=" + XMLHttpRequest.status + ",XMLHttpRequest.readyState=" + XMLHttpRequest.readyState + ",textStatus=" + textStatus);
},
success: function (json) {
alert("你好,成功了!"+json.jsonValidateReturn[0] + ", " + json.jsonValidateReturn[1] + "," + json.jsonValidateReturn[2]);
}
});
});
</script>
</head>
<body>
<form id="formID" runat="server">
<h2>
jQuery - Validation-Engine - Ajax驗證
</h2>
<br />
<p>
Ajax:<input id="Text3" type="text" class="validate[required,ajax[ajaxUsers]]" />
</p>
<p>
Ajax:<input id="Text4" type="text" class="validate[ajax[ajaxUsers]]"/>
</p>
<p>
Ajax:<input id="Text1" type="text" class="validate[required]"/>
</p>
</form>
</body>
</html>

url: "AjaxBackstage/AjaxValidation.ashx" 這裡指向剛才建立的一般處理常式
調試結果返回的是正確的json格式的資料會執行 succes下面的函數,否則執行error下面的函數,下面看一下效果

返回出現錯誤時,是無法完成Validation-Engine的AJAX驗證的。這裡顯示顯示錯誤是"pars error" 編譯器錯誤,根本原因還是返回資料的問題。下面是幕後處理程式的返回資料的部分,筆者測試,欄位不能用單引號,否則見效果,所以這裡用傳遞的資料用雙引號引起來。 複製代碼 代碼如下:string str;
if (validateValue == "abc")
str = "{\"jsonValidateReturn\":[\"" + validateId + "\",\"" + validateError + "\",true]}";
else
str = "{\"jsonValidateReturn\":[\"" + validateId + "\",\"" + validateError + "\",false]}";
//if (validateValue == "abc")
// str = "{'jsonValidateReturn':['" + validateId + "','" + validateError + "',true]}";
//else
// str = "{'jsonValidateReturn\":['" + validateId + "','" + validateError + "',false]}";

資料請求成功:

5.3 第三步,根據上面的例子給jquery.validationEngine.js檔案動動“手術”,參考上面第5條。jsonValidateReturn ?對,關鍵就在這個地方,官方版本是PHP的例子在傳遞的json資料有點小區別,導致json[0]擷取不到資料。所以在本例中json.jsonValidateReturn[index]擷取的資料才正常。當然你不喜歡這個名稱jsonValidateReturn也可以自己定義一個名稱,但前提必須是後台傳遞資料時的名稱和這裡的名稱是一致的。 複製代碼 代碼如下:// 非同步呼叫成功,資料是從伺服器的JSON答案
// 改動地方,原來jvar errorFieldId =json[0] 在asp.Net中是擷取不到資料的
// 改成下面的方式,注意jsonValidateReturn這裡名稱定死了,在AJAX後台返回資料時必須和jsonValidateReturn一致
// {"jsonValidateReturn":["validateId","validateError","true"]}
var errorFieldId = json.jsonValidateReturn[0]; //改動的地方
//var errorField = $($("#" + errorFieldId)[0]);
var errorField = $($("input[id='" + errorFieldId +"']")[0]);
// 確保我們找到元素
if (errorField.length == 1) {
var status = json.jsonValidateReturn[2]; //改動的地方
// 從伺服器讀取的可選MSG
var msg = json.jsonValidateReturn[1]; //改動的地方
if (!status) {
// Houston,我們有一個問題 - 顯示一個紅色的提示
options.ajaxValidCache[errorFieldId] = false;
options.isError = true;

5.4 第四步,在語言檔案中自訂規則,官方語言套件中有中文語言檔案調用jquery.validationEngine-zh_CN.js,這裡筆者添加一個“ajaxUsers”規則。 複製代碼 代碼如下:// --- CUSTOM RULES -- Those are specific to the demos, they can be removed or changed to your likings
"ajaxUsers": {
"url": "AjaxBackstage/AjaxValidation.ashx", // "validate.action", "validate.action"ajax驗證使用者名稱,會post如下參數:validateError ajaxUser;validateId user;validateValue cccc
"alertTextOk": "* 帳號可以使用.",
"alertTextLoad": "* 檢查中, 請稍後...",
"alertText": "* 帳號不能使用."
},
"ajaxUserCall": {
"url": "ajaxValidateFieldUser",
// you may want to pass extra data on the ajax call
//"extraData": "name=eric",
"alertText": "* 此名稱已被其他人使用",
"alertTextLoad": "* 正在確認名稱是否有其他人使用,請稍等。"
},

OK,試試看驗證是不是能成功了呢。。。

最後,總結出來一點經驗,拿出來分享。“從事物的本質中尋找問題的答案!”。

作者:skylinetour

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.