首页 | 源码下载 | 网站模板 | 网页特效 | 广告代码 | 网页素材 | 字体下载 | 书库 | 站长工具
会员投稿 投稿指南 RSS订阅
当前位置:主页>网络编程>Javascript教程>资讯:jQuery Validation插件remote验证方式的Bug

jQuery Validation插件remote验证方式的Bug

www.jz123.cn  2010-10-21   来源:   中国建站    责任编辑(袁袁)    我要投递新闻

便出在remote验证方式上,还好修改起来非常容易,在此记录一下,也方便以后的参考。

  在表单验证时,有时候会需要发一个AJAX请求去服务器上进行判断,例如在用户注册时检查用户名是否存在。jQuery Validation插件提供了一种remote方式来实现这一点。例如我可以这样验证表单:

<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方法,它的参数名可能也有所不同:

public ActionResult Verify(string name) { ... }

  根据文档描述,此时我们应该这样写:

$('#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) {
                ...

  我很奇怪,不知道为什么会这样做,这样根本没有起到指定参数名的作用。那么,改吧:

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类似的文件只能自己进行压缩了。

  居然会出现这样的问题,实在令人费解。


上一篇:jQuery技巧总结 下一篇:关于 jQuery getJSON方法的一点心得

评论总数:0 [ 查看全部 ] 网友评论


关于我们隐私版权广告服务友情链接联系我们网站地图