当前位置: 移动技术网 > IT编程>开发语言>.net > ASP.NET中实现jQuery Validation-Engine的Ajax验证

ASP.NET中实现jQuery Validation-Engine的Ajax验证

2017年12月12日  | 移动技术网IT编程  | 我要评论

边缘青年,gb2312,xyfuns

见下图:

验证的例子:

官方地址:

这个插件支持大部分的浏览器,但由于有使用到了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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网