【问题标题】:MVC custom unobtrusive validation always showing messageMVC 自定义不显眼验证始终显示消息
【发布时间】:2011-11-03 15:23:52
【问题描述】:

我在创建自定义不显眼的验证方面还很陌生,但遇到了一个奇怪的问题。

这个验证基本上只是检查数据库(通过 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 时它会停留在那里。

知道发生了什么吗?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • +1,因为这使我走上了正确的道路。 success 响应基本上被忽略了,因为它不是响应验证功能,而是成功功能。请参阅我的解决方法。
    【解决方案2】:

    感谢 Greg 和 Zero 的回复,这让我更加了解了返回值。

    问题是我的 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;
        }
    );
    

    【讨论】:

      【解决方案3】:

      几个猜测:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-22
        • 2016-04-20
        • 2019-02-22
        • 2012-03-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多