近期发布
专辑列表

Windows Phone 游戏合集
JQueryElement
IEBrowser
WPXNA

功能完善的 jquery validator 完成用户注册的验证

布了 JQueryElement 3.6.1, 上次向大家提到了新的插件 Validator, 那么今天就好好的说明下这个验证插件吧.

本文更新:

2011-12-10: 增加 Async 属性参考.

2011-12-12: 去掉 ParameterList 和 AjaxList.

由于精力有限, 不能在多个博客中保证文章的同步, 可在如下地址查看最新内容, 请谅解:

http://code.google.com/p/zsharedcode/wiki/JQueryElementValidatorDoc

请到 Download 下载资源 的 JQueryElement 示例下载一节下载示例代码

本文将系统讲解 Validator 控件的功能以及使用过程中的注意事项和技巧, 目录如下:

  * 准备

  * 客户端验证

    * 必需填写

    * 字符串长度范围

    * 数值大小范围

    * 验证邮箱, 网址, 日期

  * 获取是否验证成功和转化后的数据

  * 服务器端验证

 

准备

请确保已经在 http://code.google.com/p/zsharedcode/wiki/Download 中下载 JQueryElement 最新的版本.

请使用指令引用如下的命名空间:

<%@ Register Assembly="zoyobar.shared.panzer.JQueryElement"
Namespace
="zoyobar.shared.panzer.ui.jqueryui.plusin"
TagPrefix
="je"%>
<%@ Register Assembly="zoyobar.shared.panzer.JQueryElement"
Namespace
="zoyobar.shared.panzer.web.jqueryui"
TagPrefix
="je"%>

除了命名空间, 还需要引用 jQueryUI 的脚本和样式, 在 http://code.google.com/p/zsharedcode/wiki/Download 下载的压缩包中包含了一个自定义样式的 jQueryUI, 如果需要更多样式, 可以在 http://jqueryui.com/download 下载:

<link type="text/css" rel="stylesheet" href="[样式路径]/jquery-ui-<version>.custom.css"/>
<script type="text/javascript" src="[脚本路径]/jquery-<version>.min.js">
</script><script type="text/javascript" src="[脚本路径]/jquery-ui-<version>.custom.min.js"></script>

客户端验证

通过简单的介绍 Validator 的属性, 便可以大致的了解如何进行客户端验证:

DefaultValue 表示在用户没有输入值时的默认值, 可以设置为字符串, 数值等, 比如: 'abc', 100.

Target/Equal 表示目标/匹配目标的选择器, 比如: #pw, #pw2, 不同于 Selector 属性, TargetEqual 不需要为选择器添加单引号, 如果不设置 Equal 则表示不判断两个目标的值是否相同.

Tip 表示在不符合某个规则时的提示信息, SuccessTip 除外, 因为 SuccessTip 表示验证成功时的信息, 比如: MaxTip="最大值不能超过 100".

Event 表示触发验证操作的事件, 默认为 change.

Max/Min 如果数据为字符串, 则表示字符串的最大/最小长度, 如果数据为数值, 则表示数值的最大/最小值.

Name 为验证项设置的名称, 一般不设置.

Need 表示数据是否是必需的, 默认为 false.

Provider 为一个自定义的格式转换函数.

Reg 为一个数据必须符合的 javascript 正则表达式, 比如: /^d+$/.

ShowTip 表示是否显示提示, 默认为 true.

Type 表示一种数据类型, 可以是 string, number, boolean, date 中的一种, 如果设置为 string, number, boolean, 则表示数据应该可以被转化为字符串, 数值, 布尔值. 如果需要判断字符串最小长度大于等于 1, 在设置 Min="1" 的同时, 还需要设置 Type="string" 来表示是针对字符串的判断. 设置 Type 为 date 并不能判断数据是否为一个日期, 而是试图在 Ajax 中将数据转化为日期格式的字符串, 如果需要判断数据是否为日期格式, 请设置 Reg="$.panzer.reg.dateISO".

必需填写

设置 Need 属性为 true, 即可限制目标不能为空:

<input id="email" type="text"/>
<je:Validator ID="vEmail" runat="server" IsVariable="true"
Target
="#email" Need="true"
NeedTip
='<font color="red">请填写您的邮箱地址</font>'
>
</je:Validator>

代码中, 设置 Target 为 #email, 表示 Validator 的验证目标是 id 为 email 的文本框. Need 设置为 true, 表示用户必须填写邮箱地址. NeedTip 表示在没有填写邮箱地址时的提示信息, 可以包含 html 代码.

字符串长度范围

通过设置 MaxMin 就可以限制字符串的长度, 建议同时设置 Type="string", 因为如果不设置数据类型和默认值, 那么没有输入值将默认为 '':

<input id="password" type="password"/>
<je:Validator ID="vPassword" runat="server" IsVariable="true" Target="#password"
Min
="4" MinTip='<font color="red">密码长度至少 4 位</font>'
Max="10" MaxTip='<font color="red">密码长度最多 10 位</font>'>
</je:Validator>

代码中并没有像建议中提到的设置 Type="string", 因为即便默认为 '', 长度仍然是小于 4 的.

数值大小范围

和限制字符串类似, 设置 MaxMin 同样可以限制数值的大小范围, 同时需要设置 Type="number":

<input id="age" type="text"/>
<je:Validator ID="vAge" runat="server" IsVariable="true" Target="#age"
Type
="number" TypeTip='<font color="red">请填写一个数字</font>'
Min="10" MinTip="不能小于 10 岁"
Max="200" MaxTip="您还活着吗?">
</je:Validator>

验证邮箱, 网址, 日期

使用 Reg 属性可以使验证的功能更大强大, 可以使用在 $.panzer.reg 中预设的几个正则表达式来判断邮箱等格式:

<input id="email" type="text"/>
<je:Validator ID="vEmail" runat="server" IsVariable="true" Target="#email"
Reg
="$.panzer.reg.email" RegTip='<font color="red">请填写一个正确的邮箱地址</font>'>
</je:Validator>

除了使用 $.panzer.reg.email, 你还可以使用 url 来验证网址, 使用 dateISO 来验证格式类似于 '2011-1-1' 的字符串.

获取是否验证成功和转化后的数据

使用客户端属性 valid 可以获取某个 Validator 控件对应的目标验证是否通过, 使用 value 则可以获取目标包含的数据:

function refresh(value, tip, valid) {

if (vEmail.__validator('option', 'valid') &&
vPassword.__validator('option', 'valid') &&
vNickname.__validator('option', 'valid') &&
vAge.__validator('option', 'valid'))
cmdRegister.button('enable');
else
cmdRegister.button('disable');

}

代码中的 vEmail 等为 Validator 控件的 ID, 这需要设置 ValidatorIsVariable 属性为 true, 访问 validator 的 valid 属性, 可以获取到最后一次验证的结果, 如果返回 true, 则表示验证是成功的.

javascript 函数 refresh 将设置为每一个 Validator 控件的 Checked 事件, 这样在 validator 验证完目标后会调用 refresh, 来决定是否让注册按钮可用.

下面是注册按钮的代码, 点击按钮将调用方法 RegisterWeibo, 而参数的值是通过 validator 的 value 属性来获取的.

<je:Button ID="cmdRegister" runat="server" IsVariable="true" Label="注册" Disabled="true">
<ClickAsync Url="webservice.asmx" MethodName="RegisterWeibo" Success="
function(data){
alert(data);
}
"
>
<ParameterList>
<je:Parameter Name="email" Type="Expression"
Value
="vEmail.__validator('option', 'value')"/>
<je:Parameter Name="password" Type="Expression"
Value
="vPassword.__validator('option', 'value')"/>
<je:Parameter Name="nickname" Type="Expression"
Value
="vNickname.__validator('option', 'value')"/>
<je:Parameter Name="age" Type="Expression"
Value
="vAge.__validator('option', 'value')"/>
</ParameterList>
</ClickAsync>
</je:Button>

也可以设置 ParameterType 属性为 Selector, Value 为选择器来获取文本框的值, 并配合 DataType 来设置传递给服务器的数据类型, 而这里使用 validator 的 value 属性也能达到同样的效果, 因为 value 的类型也就是通过 ValidatorType 属性设置的类型.

服务器端验证

除了可以在客户端, 也可以在服务器端验证内容的合法性, 比如, 在服务器端验证昵称是否已经被注册:

<input id="nickname" type="text"/>
<je:Validator ID="vNickname" runat="server"
Target
="#nickname"

>

<CheckAsync Url="webservice.asmx" MethodName="CheckNickname"
Success
="
function(pe, e){

if(!e.valid && null != e.tip){
pe.jquery.html(e.tip);
}

}
"
>
</CheckAsync>

</je:Validator>

通过 CheckAsync 可以设置验证时的 Ajax 操作设置, 这里调用了服务器端的 CheckNickname 方法. 在 Success 属性中设置处理返回结果的 javascript 函数, 参数 e 包含 value, tip, valid, custom 四个属性, 分别表示验证后的值, 提示信息, 是否验证成功, 以及一个自定义对象, 参数 pe 的 jquery 属性表示 validator 自身.

下面是服务器端的 CheckNickname 方法:

[WebMethod]
[ScriptMethod]
public SortedDictionary<string, object> CheckNickname ( string value )
{
this.Context.Response.Cache.SetNoStore ( );

SortedDictionary<string, object> values = new SortedDictionary<string, object> ( );
values.Add ( "value", value );
values.Add ( "tip", value == "abc" ?
"<font color=\"red\">abc 这个昵称已经被注册了, 请换一个吧</font>" : null );
values.Add ( "valid", value != "abc" );

return values;
}

对于服务器端验证的方法应该具有名为 value 的参数, 参数的类型可以是 int, string, bool 等, 方法应该返回如下格式的 JSON:

{
"value": <值>,
"tip": <提示>,
"valid": <表示是否成功的布尔值, 为 true 或者 false>
[, "custom": <自定义对象, 比如: { message: 'ok' }>]
}

JQueryElement 是开源共享的代码, 可以在 http://code.google.com/p/zsharedcode/wiki/Download 页面下载 dll 或者是源代码.

实际过程演示: http://www.tudou.com/programs/view/vz3kFojbU58/, 建议全屏观看.

修订历史

2011-11-26: 修改关于引用 jQueryUI 的介绍.

posted @ 2011-11-07 16:14  麦丝平方  阅读(2760)  评论(9编辑  收藏  举报