jquery验证远程-验证数据是否在字段中

jquery验证远程-验证数据是否在字段中,jquery,validation,Jquery,Validation,一般说明: 在我的表单中,有一个字段需要远程验证。在远程调用中,我发送表单元素的值以及该元素可能依赖的几个其他表单元素的值(在服务器上用于验证) 调用远程验证时,效果非常好。问题是,只有当表单元素中存在值时,才会调用远程验证。根据发送到远程验证的参数,可能需要此表单元素,或者可能存在其他验证问题 无论字段中是否包含数据,我如何强制对此字段进行远程验证 特定场景: 获得角色列表和销售人员代码文本输入。 服务器端逻辑:(1)如果选择了salesperson角色,则需要SalespersCode;(2

一般说明
在我的表单中,有一个字段需要远程验证。在远程调用中,我发送表单元素的值以及该元素可能依赖的几个其他表单元素的值(在服务器上用于验证)

调用远程验证时,效果非常好。问题是,只有当表单元素中存在值时,才会调用远程验证。根据发送到远程验证的参数,可能需要此表单元素,或者可能存在其他验证问题

无论字段中是否包含数据,我如何强制对此字段进行远程验证

特定场景
获得角色列表和销售人员代码文本输入。
服务器端逻辑:(1)如果选择了salesperson角色,则需要SalespersCode;(2) 如果未选择salesperson角色,salespersoncode必须为空

请注意,我确实向服务器发送了其他表单元素值,为了简洁起见,这里没有包括其他服务器端逻辑,因为它们不会为这个问题增加值,只会混淆问题

<select name="roles" id="roles" multiple="multiple" size="5"></select>
<input type="text" name="salespersoncode" id="salespersoncode" />

$("#add_user_form").validate({
  rules: {
    salespersoncode: {
      remote: {
        type: "post",
        url: "/AdminJson/CheckSalespersonCode",
        dataType: "json",
        data: {
            salespersoncode: function () { return $("#salespersoncode").val(); },
            roles: function () { return $("#roles").val(); }
        }
      }
    }
  }
}

$(“#添加用户表格”)。验证({
规则:{
销售人员编码:{
远程:{
类型:“post”,
url:“/AdminJson/checksalersoncode”,
数据类型:“json”,
数据:{
salersoncode:function(){return$(“#salersoncode”).val()},
角色:函数(){return$(“#roles”).val()}
}
}
}
}
}
我不想输入“required”验证选项,因为并非所有情况下都需要salersoncode字段

我的问题是:无论SalesorsOnCode字段中是否包含数据,如何强制对其进行远程验证


提前感谢

首先尝试明确设置SalesorsCode:

salespersoncode: {
    salesPersonCode: ($("#salespersoncode").val().length > 0) ? $("#salespersoncode").val() : "",
    remote: {
        type: "post",
        url: "/AdminJson/CheckSalespersonCode",
        dataType: "json",
        data: {
            salespersoncode: salesPersonCode; },
            roles: function () { return $("#roles").val(); }
        }
    }
}

看起来,如果没有所需的验证,则无法使用具有远程验证的表单元素。 它最终导致依赖项不匹配

remote方法的第一行是检查它是否是可选的——如果是可选的,则返回一个依赖项不匹配(可选是remote的倒数)


我提出的解决方案是对“required”规则使用依赖项回调。在“required”规则的函数中,调用同步ajax调用来测试服务器UI中的值,并返回true/false。

在调用validate()方法之前添加这段代码:


在validate()中函数,我不知道如何才能像您建议的那样创建局部变量。我已经更新了我的问题,以便在其中包含更多的验证方法详细信息。您是否介意更新您的答案,告诉我在浏览器不显示js错误的情况下,我可以将局部变量放置在何处?这里的一个重要问题是,元素必须具有带有nam的属性e远程验证程序!!(没有值的属性就可以了)。如果不想添加此属性,并且只要在指定远程规则时使用远程验证,请使用此条件
typeof this.settings.rules[$(element).attr('name')!='undefined'&&typeof this.settings.rules[$(element).attr('name')].remote!='undefined'
而不是
$(元素).is('remotevalidator]'))
但有一个关键点!您需要通过在
规则设置中的
远程
对象上设置属性/值
async:false
使远程调用异步。否则,您将有意外行为,例如valid()不会等待服务器的响应。而是在MVC/.NET中添加一个自定义属性,如[remote validator],我只是使用了添加到元素中的现有属性,如下所示:将[remote validator]替换为:[data val remote url]
$.validator.methods._required = $.validator.methods.required;
$.validator.methods.required = function( value, element, param )
{
  if ( $(element).is('[remote-validator]') && !$(element).hasClass('required') )
        return true;
 return  $.validator.methods._required.call( this, value, element, param );
}