jquery 远程验证 - 验证字段中的数据是不是

Posted

技术标签:

【中文标题】jquery 远程验证 - 验证字段中的数据是不是【英文标题】:jquery validation remote - validate whether data in field or notjquery 远程验证 - 验证字段中的数据是否 【发布时间】:2011-10-01 15:24:51 【问题描述】:

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

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

如何强制远程验证该字段是否包含数据?

具体场景: 有一个角色列表和一个销售员代码文本输入。 服务器端逻辑:(1)如果选择了salesperson角色,需要salespersoncode; (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(); 
        
      
    
  

我不想输入“必需”验证选项,因为并非在所有情况下都需要 salespersoncode 字段。

我的问题又来了:如何强制对 salespersoncode 字段进行远程验证,无论它是否有数据?

提前致谢

【问题讨论】:

【参考方案1】:

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

$.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 );
 

【讨论】:

这里重要的一点是元素必须有一个名为remote-validator的属性!! (没有值的属性很好)。如果您不想添加此属性,而只是每当指定远程规则时使用远程验证,请使用此条件typeof this.settings.rules[ $(element).attr('name') ] != 'undefined' &amp;&amp; typeof this.settings.rules[ $(element).attr('name') ].remote != 'undefined' 而不是$(element).is('[remote-validator]') 不过有一个关键点!您需要通过在rules 设置中的remote 对象上设置属性/值async: false 来使远程调用异步。否则你会出现意想不到的行为,例如。 valid() 不会等待服务器的响应。 然后在 MVC / .NET 中添加一个自定义属性,例如 [remote-validator] 我只是使用了添加到元素中的现有属性,如下所示:将 [remote-validator] 替换为: [data-val-remote-url]【参考方案2】:

看起来您不能拥有一个具有远程验证的表单元素,而无需同时进行必需的验证。 它最终导致依赖不匹配。

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

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

【讨论】:

【参考方案3】:

先尝试明确设置salesPersonCode:

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

【讨论】:

在 validate() 函数中,我看不出如何像您推荐的那样创建局部变量。我已经更新了我的问题,以便在其中包含更多验证方法的详细信息。您介意更新您的答案,告诉我可以在哪里放置本地 var 而浏览器不显示 js 错误?

以上是关于jquery 远程验证 - 验证字段中的数据是不是的主要内容,如果未能解决你的问题,请参考以下文章

jQuery验证远程方法使用以检查用户名是不是已经存在

jQuery 验证插件的问题(远程验证)

当两个字段具有相同的id时,jQuery远程验证不起作用

表单验证 - jQuery 验证是不是足够以及如何巧妙地验证 PHP 中的数据?

jQuery Validate Plugin - 触发单个字段的验证

使用 Jquery 引导验证来验证字段数组中的单个字段以及兄弟字段