easyui类似的 web框架自定义的验证规则无效,而且总默认走框架封装的验证规则,但是名

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&基于avalon的验证框架开发完毕,支持实时验证,失去焦点验证,提交验证,手动验证,异步验证(基于ES6的Promise)。可以在配置对象上的validationHooks中添加验证规则。 验证规则如下定义:
alpha_numeric: {
&&&&message: '必须为字母或数字',
&&&&get: function(value, data, next) {
&&&&&&&&next(/^[a-z0-9]+$/i.test(value))
&&&&&&&&&&&&
&&&&&&&&&&&&
&&&&&&&&return value
在validationHooks中自定验证规则,每个都必须写 message( message不能为空字符串)与 get方法。
验证规则不惧怕任何形式的异步,只要你决定进行验证时,执行next方法就行。next 需要传入布尔。
&&&&message: "异步验证",
&&&&get: function(value, data, next) {
&&&&&&&&setTimeout(function() {
&&&&&&&&&&&&next(true)
&&&&&&&&}, 3000)
&&&&&&&&return value
另一个例子:
beijing: {
&&&&message: "当前位置必须是在{{city}}",
&&&&get: function(value, data, next) {
&&&&&&&&$.ajax({
&&&&&&&&&&&&url: "",
&&&&&&&&&&&&dataType: "jsonp",
&&&&&&&&&&&&jsonpCallback: "callback",
&&&&&&&&&&&&success: function(data, textStatus, jqXHR) {
&&&&&&&&&&&&&&&&data.data.city = "北京"
&&&&&&&&&&&&&&&&next(data.city == value)
&&&&&&&&&&&&}
&&&&&&&&})
&&&&&&&&return value
注意,本组件是基于 avalon1.3.7开发,如果是很旧的版本,可以使用avalon.,它一直兼容到avalon1.2.0。
注意,本组件只能绑定在 form元素上, &form ms-widget="validation"&&/&
验证框架提供了各式各样的回调,满足你最挑剔的需求:
onSuccess, onError, onComplete, onValidateAll, onReset, onResetAll
其中,前面四个是一个系列,它们都有1个参数,是一个对象数组,里面一些 验证规则对象(如果成功,数组为空); onReset是在元素获取焦点做重置工作的,如清理类名, 清空value值,onResetAll是用于重置整个表单,它会在组件执行它辖下的所有元素的onReset回调后再执行。
验证规则对象的结构如下:
&&&&element: element,
&&&&data: {
&&&&&&&&city: "北京"
&&&&message: '当前位置必须是在{{city}}',
&&&&validateRule: "beijing",
&&&&getMessage: function() {}
如果用户指定了 norequired验证规则,如果input为空, 那么就会跳过之后的所有验证
validationHooks
空对象,用于放置验证规则
avalon.noop
空函数,单个验证成功时触发,this指向被验证元素this指向被验证元素,传参为一个对象数组
avalon.noop
空函数,单个验证失败时触发,this与传参情况同上
onComplete
avalon.noop
空函数,单个验证无论成功与否都触发,this与传参情况同上
onValidateAll
avalon.noop
空函数,整体验证后或调用了validateAll方法后触发
avalon.noop
空函数,表单元素获取焦点时触发,this指向被验证元素,大家可以在这里清理className、value
onResetAll
avalon.noop
空函数,当用户调用了resetAll后触发,
validateInBlur
true,在blur事件中进行验证,触发onSuccess, onError, onComplete回调
validateInKeyup
true,在keyup事件中进行验证,触发onSuccess, onError, onComplete回调
validateAllInSubmit
true,在submit事件中执行onValidateAll回调
resetInFocus
true,在focus事件中执行onReset回调
接口方法与固有属性
为元素绑定submit事件,阻止默认行为
$destory()
销毁组件,移除相关回调
validateAll(callback)
验证当前表单下的所有非disabled元素
参数名/返回值
Null|Function
最后执行的回调,如果用户没传就使用vm.onValidateAll
resetAll(callback)
重置当前表单元素
参数名/返回值
Null|Function
最后执行的回调,如果用户没传就使用vm.onResetAll
validate(data,isValidateAll)
验证单个元素对应的VM中的属性是否符合格式
参数名/返回值
isValidateAll
Undefined|Boolean
是否全部验证,是就禁止onSuccess, onError, onComplete触发
er avalon.validation自带了许多 验证规则,满足你一般的业务需求。
大家可以在onReset的回调里得到第二个参数data, 然后调用data.valueResetor()将VM中的数据也置空,如布尔数据变false, 数值数据变0,数组数据变[],字符串数组变成""
也可以在页面添加不依赖于ms-duplex的绑定
validateVM.data.push({
&&&&valueAccessor: function() {}
&&&&validateParam: "xxx",
&&&&element: element
项目主页:
基于avalon的验证框架:validation
Commons项目中用来处理常用的编码方法的工具类包,例如DES、SHA1、MD5、Base64等等。项目主页:
0//ftp,使文件传到服务器上protectedfunctionftp_send($des,$src){$ftp_ip='ip地址';$ftp_user='ftp用户名';$ftp_pass
&?php/***DES对称加解密类**/classDes{//DES加密functionencrypt($encrypt,$key=&&){$iv
pyDES是一个Python的模块,用来提供DES、Triple-DES的加密算法。使用示例:frompyDesimport*#ForPython3,you'llneedtousebytes
0是一个Python的模块,用来提供DES、Triple-DES的加密算法。使用示例:frompyDesimport*#ForPython3,you'llneedtousebytes,i.e.
Botan是一个C++的加密算法库,支持AES,DES,SHA-1,RSA,DSA,Diffie-Hellman等多种算法,支持X.509认证以及CRLs和PKCS#10。项目主页:
此类位于javax.crypto.spec包下。声明如下:publicclassDESKeySpecextendsObjectimplementsKeySpec此类指定一个DES密钥。KeySpec
;i++){for(intj=0;j&4;j++){scanf("%d",des[i]+j);if(des[i][j]==0){aim=6-i-j;des[i][j]=16
正则表达式在线测试工具
FaceYe @ 2015 &&&&
ICP备案号:粤ICP备1500070基于MVC4+EasyUI的Web开发框架经验总结(12)--利用Jquery处理数据交互的几种方式 - 伍华聪 - 博客园
随笔 - 488, 文章 - 20, 评论 - 7190, 引用 - 20
在基于MVC4+EasyUI的Web开发框架里面,大量采用了Jquery的方法,对数据进行请求或者提交,方便页面和服务器后端进行数据的交互处理。本文主要介绍利用Jquery处理数据交互的几种方式,包括获取数据并显示,插入新数据到服务器,更新数据,删除数据等操作。
1、利用Jquery获取数据并显示
为了顺利获取数据,我们需要保持页面端调用和服务器端保持一致,并相应的把数据转换或者封装为对象实体进行处理。
下面我们以一个简单的全国省份、全国城市、全国城市行政区的案例进行Demo代码的介绍。
总体的操作包括了,分页查询,添加数据的保存,编辑显示和保存,查看信息的数据显示等等,而利用Jquery获取数据并绑定到界面控件上的代码操作如下所示,主要就是利用getJson方法进行处理。
//绑定编辑详细信息的方法
function BindEditInfo(ID) {
//使用同步方式,使得联动的控件正常显示
$.ajaxSettings.async = false;
//首先用户发送一个异步请求去后台实现方法
$.getJSON("/Province/FindByID?id=" + ID, function (info) {
//赋值有几种方式:.datebox('setValue', info.Birthday);.combobox('setValue', info.Status);.val(info.Name);.combotree('setValue', info.PID);.numberbox('setValue', info.Number);
$("#ID").val(info.ID);
$("#ProvinceName").val(info.ProvinceName);
isAddOrEdit = 'edit';//新增对话框标识
//绑定查看详细信息的方法
function BindViewInfo(ID) {
//发送请求
$.getJSON("/Province/FindByID?id=" + ID, function (info) {
$("#ID2").text(info.ID);
$("#ProvinceName2").text(info.ProvinceName);
getJson方法主要就是调用MVC里面控制器的方法,获取数据,并把它转换为Json的对象实体,这样我们就能方便获取到对应的属性,从而绑定到界面控件。而FindByID的接口是控制器里面的方法定义,我们可以通过下面的控制器基类代码了解具体的逻辑。
/// &summary&
/// 查询数据库,检查是否存在指定ID的对象
/// &/summary&
/// &param name="id"&对象的ID值&/param&
/// &returns&存在则返回指定的对象,否则返回Null&/returns&
public virtual ActionResult FindByID(string id)
//检查用户是否有权限,否则抛出MyDenyAccessException异常
base.CheckAuthorized(AuthorizeKey.ViewKey);
ActionResult result = Content("");
T info = baseBLL.FindByID(id);
if (info != null)
result = ToJsonContentDate(info);
/// &summary&
/// 返回处理过的时间的Json字符串
/// &/summary&
/// &param name="date"&&/param&
/// &returns&&/returns&
public ContentResult ToJsonContentDate(object date)
var timeConverter = new IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" };
return Content(JsonConvert.SerializeObject(date, Formatting.Indented, timeConverter));
2、利用Jquery保存数据到服务器
上面的操作是从服务端获取数据并显示在页面上,下面我们来介绍如何把数据通过通过Jquery调用,保存到服务器上。
在Web框架里面,我们把添加数据和编辑数据的界面,共享了一个层的界面代码,这样可以减少主界面视图Index.cshtml的代码数量(因为我们把各种界面的代码放在一个文件里面,方便操作管理)。
&!--------------------------添加/修改信息的弹出层----------------------------&
&div id="DivAdd" class="easyui-dialog" style="width:680height:200padding:10px 20px"
closed="true" resizable="true" modal="true" data-options="iconCls: 'icon-add',buttons: '#dlg-buttons'"&
&form id="ffAdd" method="post" novalidate="novalidate"&
&div id="tabAdd" class="easyui-tabs" &
&div title="基本信息" data-options="iconCls:'icon-view'"
style="padding:5px 5px"&
&table id="tblAdd1" class="view"&
&label for="ProvinceName"&省份名称:&/label&
&td colspan="3"&
&input class="easyui-validatebox" type="text" id="ProvinceName" name="ProvinceName" style="width:280"
&div style="text-align: padding-top:10px"&
&input type="hidden" id="ID" name="ID" /&
&a href="javascript:void(0)" class="easyui-linkbutton" id="btnAddOK" iconcls="icon-ok" onclick="SaveEntity()"&确定&/a&
&a href="javascript:void(0)" class="easyui-linkbutton" iconcls="icon-cancel" onclick="javascript:$('#DivAdd').dialog('close')"&关闭&/a&
而数据的保存,我们也用同一个函数,这样也很方便,同时减少代码数量,保存操作的javascript脚本函数如下所示。
//绑定添加按钮的事件
function SaveEntity() {
//判断表单的信息是否通过验证
var validate = $("#ffAdd").form('validate');
if (validate == false) {
return false;
var postData = $("#ffAdd").serializeArray();
$.post(url, postData, function (json) {
var data = $.parseJSON(json);
if (data.Success) {
//添加成功
1.关闭弹出层,2.刷新DataGird
showTips("保存成功");
$("#DivAdd").dialog("close");
$("#grid").datagrid("reload");
$("#ffAdd").form("clear");
showError("保存失败:" + data.ErrorMessage, 3000);
}).error(function () {
$.messager.alert("提示", "您未被授权使用该功能,请联系管理员进行处理。", 'warning');
由于每个层都定义了Name和ID,因此我们可以很容易通过下面方式获取到对应的对象数据,方便提交。
var postData = $("#ffAdd").serializeArray();
插入数据的时候,调用的路径如下所示:
url = '/Province/Insert';
更新数据的时候,调用的路径如下数艘:
url = '/Province/Update?ID=' + ID;
插入对象到数据库里面的控制器方法,主要还是调用BLL层的对象方法进行处理,不过事先会进行一定的权限控制和信息补充,如下代码所示。
/// &summary&
/// 插入指定对象到数据库中
/// &/summary&
/// &param name="info"&指定的对象&/param&
/// &returns&执行操作是否成功。&/returns&
public virtual ActionResult Insert(T info)
//检查用户是否有权限,否则抛出MyDenyAccessException异常
base.CheckAuthorized(AuthorizeKey.InsertKey);
CommonResult result = new CommonResult();
if (info != null)
OnBeforeInsert(info);
result.Success = baseBLL.Insert(info);
catch(Exception ex)
LogTextHelper.Error(ex);//错误记录
result.ErrorMessage = ex.M
return ToJsonContent(result);
我们注意到,插入和更新操作,返回的对象都是&CommonResult &对象,这个对象,包含了一个Success的布尔属性,用来表示是否成功,还有一个ErrorMessage属性,用来标识错误信息的,所以我们利用Javascript脚本处理保存操作的时候,也需要使用这两个属性,用来区分和提示信息的显示。
var data = $.parseJSON(json);
if (data.Success) {
//添加成功
1.关闭弹出层,2.刷新DataGird
showTips("保存成功");
$("#DivAdd").dialog("close");
$("#grid").datagrid("reload");
$("#ffAdd").form("clear");
showError("保存失败:" + data.ErrorMessage, 3000);
操作完成后,提示成功的信息如下所示。
3、利用Jquery删除列表数据操作
利用Jquery函数,可以POST删除的请求到服务器上,在此之前我们需要了解我们需要删除那些记录,并确认提示是否删除,删除成功后,更新列表,并提示用户,大致的页面代码函数如下所示。
//实现删除数据的方法
function Delete() {
//得到用户选择的数据的ID
var rows = $("#grid").datagrid("getSelections");
if (rows.length &= 1) {
//遍历出用户选择的数据的信息,这就是用户用户选择删除的用户ID的信息
var ids = "";
//1,2,3,4,5
for (var i = 0; i & rows. i++) {
ids += rows[i].ID + ",";
//最后去掉最后的那一个,
ids = ids.substring(0, ids.length - 1);
var postData = { Ids: ids };
//然后确认发送异步请求的信息到后台删除数据
$.messager.confirm("删除确认", "您确认删除选定的记录吗?", function (action) {
if (action) {
type: 'POST',
url: '/District/DeletebyIds',
dataType: 'json',
data: postData,
success: function (data) {
if (data.Success) {
showTips("删除选定的记录成功");
$("#grid").datagrid("reload");
//当删除完成之后,第二次删除的时候还记得上次的信息,这样是不可以的,所以我们需要清除第一次的信息
rows.length = "";//第一种方法
$("#grid").datagrid("clearSelections");//第二种方法
showError("操作失败:" + data.ErrorMessage, 3000);
$.messager.alert("提示", "请选择你要删除的数据");
而服务器的MVC控制器类,我们也只需要调用基类控制器方法就可以了,基本上不需要额外的处理代码。
MVC控制器基类的方法定义如下所示,注意最后返回的是一个常见类CommonResult ,承载这个是否操作成功和错误信息(如果存在的话)。
/// &summary&
/// 删除多个ID的记录
/// &/summary&
/// &param name="ids"&多个id组合,逗号分开(1,2,3,4,5)&/param&
/// &returns&&/returns&
public virtual ActionResult DeleteByIds(string ids)
//检查用户是否有权限,否则抛出MyDenyAccessException异常
base.CheckAuthorized(AuthorizeKey.DeleteKey);
CommonResult result = new CommonResult();
if (!string.IsNullOrEmpty(ids))
List&string& idArray = ids.ToDelimitedList&string&(",");
foreach (string strId in idArray)
if (!string.IsNullOrEmpty(strId))
baseBLL.Delete(strId);
result.Success = true;
catch (Exception ex)
LogTextHelper.Error(ex);//错误记录
result.ErrorMessage = ex.M
return ToJsonContent(result);
城市信息界面如下所示。
行政区管理界面如下所示。
基于MVC4+EasyUI的Web开发框架的系列文章:下次自动登录
现在的位置:
扩展:validatebox实现多重规则验证
文章目录[]
在QQ群里面有位老兄(荒谬的旧伤口)分享了一种实现validatebox多重验证的方法,作为Easyui的校验插件没有实现多重校验能力是一种缺憾。比如说,既要限制格式为email,同时要求最长长度为20,我们就要扩展一种规则,而对长度的要求很容易变化,如果变成要求30,我们又得扩张一种规则,所以对于多重验证的需求很必要。
实现思路较为简单,扩展一种新规则:multiple,入参为其它规则,然后遍历每个规则,遇到校验不通过的时候就返回失败,并且返回对应的提示消息。思路比较简单,不过正则表达式技巧的使用还是很漂亮的,个人岁暂时不动正则,不过觉得它很优美,所以我很快就会懂的,哈哈。直接上代码了。
实现代码:
$.extend($.fn.validatebox.defaults.rules, {
multiple: {
validator: function (value, vtypes) {
var returnFlag =
var opts = $.fn.validatebox.
for (var i = 0; i & vtypes. i++) {
var methodinfo = /([a-zA-Z_]+)(.*)/.exec(vtypes[i]);
var rule = opts.rules[methodinfo[1]];
if (value && rule) {
var parame = eval(methodinfo[2]);
if (!rule[&validator&](value, parame)) {
returnFlag =
this.message = rule.
return returnF
经过以上的扩展,多重校验算是实现了,但是验证不通过时的提示信息却出现了问题,当第二个验证器验证失败的时候,提示信息会将第一个验证器的提示信息参杂进来。究其原因是validatebox内部提示信息的实现逻辑不合理,在调用验证器的validator函数之后,又对验证器的message属性做包装。
个人觉得提示信息应该完全在验证器内部实现,在外部再做包装是完全不合理的。其实这种情况目前主要就是为了处理length类型的验证器的提示信息,所以解决方案也比较明确和唯一:
修改源码,取消调用验证器之后再进一步对验证器的message属性做封装
覆写需要包装提示信息的验证器,验证器内部实现对提示信息的包装,目前只有length验证器
对于1.3.1版本,大概在5060行,注释掉以下代码:
//if(_396){
//for(var i=0;i&_396.i++){
//_397=_397.replace(new RegExp(&\\{&+i+&\\}&,&g&),_396[i]);
覆写length类型验证器:
$.extend($.fn.validatebox.defaults.rules, {
multiple : {
validator : function(value, vtypes) {
var returnFlag =
var opts = $.fn.validatebox.
for (var i = 0; i & vtypes. i++) {
var methodinfo = /([a-zA-Z_]+)(.*)/.exec(vtypes[i]);
var rule = opts.rules[methodinfo[1]];
if (value && rule) {
var parame = eval(methodinfo[2]);
if (!rule[&validator&](value, parame)) {
returnFlag =
this.message = rule.
return returnF
length : {
validator : function(value, param) {
this.message = &#039;Please enter a value between {0} and {1}.&#039;;
var len = $.trim(value).
if (param) {
for (var i = 0; i & param. i++) {
this.message = this.message.replace(new RegExp(
&\\{& + i + &\\}&, &g&), param[i]);
return len &= param[0] && len &= param[1];
message : &#039;Please enter a value between {0} and {1}.&#039;
使用方式:
&input class=&easyui-validatebox& data-options=&required:true,validType:&#039;multiple[\&#039;email\&#039;,\&#039;length[0,20]\&#039;]&#039;&&
更新日志:
在中提到了另一种解决方案,大家也可以参考一下:
$.extend($.fn.validatebox.defaults.rules, {
minLength : {
validator : function (value, param) {
var rules = $.fn.validatebox.defaults.
rules.minLength.message = &#039;Please enter at least {0} characters.&#039;;
if(!rules.email.validator(value)){
rules.minLength.message = rules.email.
if(!rules.length.validator(value,param)){
rules.minLength.message = rules.length.
return value.length &= param[0];
message : &#039;&#039;
自从1.3.2版本开始,validatebox自身已经支持多重校验了,例如:
input class=&easyui-validatebox& data-options=&required:true,validType:[&#039;email&#039;,&#039;length[0,20]&#039;]&&
【上篇】【下篇】
您可能还会对这些文章感兴趣!
日志:106篇
评论:754条
分类:47个
标签:153个
网站运行:1731天
最后更新:日下次自动登录
现在的位置:
jQuery EasyUI datagrid列名包含特殊字符会导致表格错位
首先申明:本文所述的Bug存在于1.3.3以及更高版本中,其它低版本,本人未测试,太老的版本不想去折腾了。
洒家在写前端的SQL执行工具时,表格用了 jQuery EasyUI datagrid,因为用户的SQL是千奇百怪的,所以出现了诸如:"BLOCKS*8/1024","trunc(SYSDATE)"之类的列名(field)时,表格就会错位,而且含有特殊字符的列无法手工调整大小。
经分析,datagrid组件在画表格的时候会在宿主DOM后动态追加一个style节点,里面定义列的若干class,正是因为我们的field含有"* / # ( )..."等css中class无法识别的命名,导致class无效,从而引发了一连串血案。我们来看下,有问题的style节点:
id="resultTable" style="display:"
type="text/css" easyui="true"
.datagrid-cell-c1-BLOCKS*8/1024{width:147px}
.datagrid-cell-c1-SEGMENT_NAME{width:231px}
.datagrid-cell-c1-TRUNC(SYSDATE){width:159px}
很明显第一个和第三个的class定义是无效的。那么这个问题究竟怎么破呢,源码的分析过程我就不说了,其实很简单,我们不使用field作为class后缀就行了,将field转换为十六进制是绝对安全的。下面来说说怎么改代码。
在 jquery.easyui.min.js 文件中搜索 "[\.|\s]"关键字,请放心搜索,1.3.3(包含1.3.3)之后的各大版本均有销售,搜到之后你会发现这其实是一个replace函数的正则表达式,我们只要将replace函数的执行结果进一步替代成十六进制就可以了,于是乎,代码就变成了:
field.replace(/[\.|\s]/g, "-").replace(/./g,function($1){return $1.charCodeAt(0).toString(16);});
我在replace函数之后又replace了一次,目的是将其转为十六进制,这个修改方法应该是安全无毒副作用的,请大家放心使用。
【上篇】【下篇】
您可能还会对这些文章感兴趣!
查看来自外部的引用: 2
日志:106篇
评论:754条
分类:47个
标签:153个
网站运行:1731天
最后更新:日

我要回帖

更多关于 类似于easyui的框架 的文章

 

随机推荐