MVC自定义不显眼验证始终显示消息

时间:2011-11-03 15:23:52

标签: jquery asp.net-mvc-3 unobtrusive-validation

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

此验证基本上只检查数据库(通过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时为什么它会保留在那里。

知道发生了什么事吗?

3 个答案:

答案 0 :(得分:1)

我认为这是因为你在函数结束时返回false。因此该函数将返回false,然后success回调触发尝试返回true,但为时已晚并且false已经返回到验证程序。一个简单的解决方案是使用async: false同步进行AJAX调用。

答案 1 :(得分:1)

感谢Greg和Zero的回应,它让我更多地玩回报值。

问题是我的Ajax成功函数中的return只是将响应返回给success函数,而不是验证函数。所以我不得不改变它以在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;
    }
);

答案 2 :(得分:0)

几个猜测:

  1. 您有“cache:true”,这意味着如果URL相同,它将无法从服务器获取。我不知道缓存是否检查POSTed参数,因此即使使用不同的参数,它也可能使用缓存版本。尝试将缓存设置为false。

  2. 我不熟悉适配器API,但以前的活动是否可能导致条件得到满足? (执行此选项时,选项实际上不为空)?