2011-11-03 138 views
1

我在创建自定义不显眼验证方面相当新,并且遇到了一个奇怪的问题。MVC定制不显眼验证总是显示消息

此验证基本上只是检查数据库(通过Ajax),以查看模型和序列号组合是否已经存在。 jQuery和Ajax看起来像预期的那样,但是我的验证消息在我的验证函数被调用后立即出现。

这里是我的jQuery:

$.validator.addMethod('newserialandmodel', 
    function (value, element, parameters) { 
     var modelNumber = $('#ProductInformation_ModelNumber').val(); 
     var serialNumber = value; 

     var token = $('input[name=__RequestVerificationToken]').val(); 

     $.ajax({ 
      type: "POST", 
      url: "/ajax/getmodelandserialexists/", 
      data: ({ 
        modelNumber: modelNumber, 
        serialNumber: serialNumber, 
        '__RequestVerificationToken': token 
        }), 
      cache: true, 
      dataType: 'json', 
      success: function (response) { 
       if (response.exists) { 
        $.validator.messages.newserialandmodel = 
         $.format($.validator.messages.newserialandmodel); 
       } 

       return !response.exists; 
      } 
     }); 

     return false; 
    } 
); 

$.validator.unobtrusive.adapters.add(
    'newserialandmodel', 
    function (options) { 
     options.rules['newserialandmodel'] = options.params; 

     if (options.message != null) { 
      $.validator.messages.newserialandmodel = options.message; 
     } 
    } 
); 

这里是表单元素是什么样子:

<input type="text" value="" 
name="ProductInformation.SerialNumber" id="ProductInformation_SerialNumber" 
data-val-required="The Serial number field is required." 
data-val-newserialandmodel="There is already a contract with the provided model and serial numbers." 
data-val-length-max="30" 
data-val-length="The 30 field requires no more than 30 characters." 
data-val="true" class="input-validation-error"> 

当我一步通过,只要它击中验证的第一线,在消息已经显示:

已经与提供的型号和序列号签有合同。

此外,即使函数返回true,它仍然保留消息。

函数/ Ajax的其余部分工作得很好,我只是想知道为什么它会立即显示此消息,以及为什么它在我返回true时停留在那里。

任何想法是怎么回事?

回答

1

感谢Greg和Zero的回复,它让我玩弄了W /返回值多一点。

问题是我的Ajax成功函数中的return只是将响应返回给成功函数,而不是验证函数。所以我不得不改变它来在Ajax成功函数中设置一个值,并返回它。

同样值得注意的是,我必须包含async: false,否则验证函数将在Ajax调用完成之前返回(默认值为false)。

$.validator.addMethod('newserialandmodel', 
    function (value, element, parameters) { 
     var modelNumber = $('#ProductInformation_ModelNumber').val(); 
     var serialNumber = value; 

     var token = $('input[name=__RequestVerificationToken]').val(); 

     var isValid = false; 

     $.ajax({ 
      type: "POST", 
      url: "/ajax/getmodelandserialexists/", 
      data: ({ 
        modelNumber: modelNumber, 
        serialNumber: serialNumber, 
        '__RequestVerificationToken': token }), 
      async: false, 
      dataType: 'json', 
      success: function (response) { 
       if (response.exists) { 
        $.validator.messages.newserialandmodel = 
         $.format($.validator.messages.newserialandmodel); 
       } 

       isValid = !response.exists; 
      } 
     }); 

     return isValid; 
    } 
); 
1

我认为这是因为你在函数结束时返回false。所以函数将返回false,然后success回调触发器试图返回true,但已经太晚了,false已经返回给验证器。一个简单的解决方案就是使用async: false同步进行AJAX调用。

+0

+1,因为这导致我走下了正确的轨道。“成功”响应基本上被忽略,因为它没有响应验证功能,而是成功功能。看到我的答案为修复。 –

0

一对夫妇的猜测:

  1. 你有“缓存:真”,这意味着如果该URL是一样的它不会从服务器获取。我不知道缓存是否会检查POST的参数,所以即使使用不同的参数,它也可能会使用缓存的版本。尝试将缓存设置为false。

  2. 我不熟悉适配器API,但以前的活动是否有可能导致条件满足? (这个选项在执行时实际上不是null)?