12

我最近有一个关于在 MVC 项目中的客户端进行复选框验证的问题。这个问题得到了成功的回答,但提出了另一个问题。

为了使我的复选框验证正常工作,我需要将以下 javascript 位直接添加到 jquery.validate.unobtrusive.js 中:

$jQval.addMethod("mustbetrue", function (value, element, param) {
    // check if dependency is met
    if (!this.depend(param, element))
        return "dependency-mismatch";
    return element.checked;
});

adapters.add("mustbetrue", function (options) {
    setValidationValues(options, "mustbetrue", true);
});

这很好用,但我对必须更改此文件以防万一 Microsoft 或验证插件男孩将来更新文件感到不满。如果我不在这个项目上工作,这个文件可能会被覆盖,而人们没有意识到它已经过定制。

因此,考虑到这一点,我尝试将其添加到外部 javascript 文件中:

$.validator.addMethod("mustbetrue", function (value, element, param) {
    // check if dependency is met
    if (!this.depend(param, element))
        return "dependency-mismatch";
    return element.checked;
});

$.validator.unobtrusive.adapters.add("mustbetrue", function (options) {
    setValidationValues(options, "mustbetrue", true);
});

不幸的是,现在我的复选框上的客户端脚本没有运行。谁能看到我做错了什么?

提前致谢

小号

4

3 回答 3

11

嗅探器,

我越看这个,我就越摇头(对自己)。

经过进一步审查,只要您在他的页面脚本中添加一行,Darin 的方法就可以工作:

<script type="text/javascript">
    $.validator.unobtrusive.adapters.addBool("mustbetrue", "required");
    $.validator.unobtrusive.parse();
</script>

每当您进行更改(例如添加新适配器)时,您必须重新解析不显眼的验证属性。由于最后一个动作jquery.validate.unobtrusive.js是解析属性,并且在解析之后正在添加适配器,因此重新解析解决了这个问题。

辅导员本

PS 这解决了你的问题,但仍然没有解决如何添加其他不使用内置方法的自定义验证器的问题,jquery.validate.js而无需修改jquery.validate.unobtrusive.js.

PPS 我找到了添加自定义验证方法的答案。为了在不修改的情况下添加自定义验证方法jquery.validate.unobtrusive.js,您需要“借用”它的一些代码以添加到您的页面脚本中。然后添加自定义方法如下所示:

<script type="text/javascript">
    var $jQval = $.validator,
        adapters,
        data_validation = "unobtrusiveValidation";

    function setValidationValues(options, ruleName, value) {
        options.rules[ruleName] = value;
        if (options.message) {
            options.messages[ruleName] = options.message;
        }
    }

    $jQval.addMethod("mustbetrue", function (value, element, param) {
        // check if dependency is met
        if (!this.depend(param, element))
            return "dependency-mismatch";
        return element.checked;
    });

    $.validator.unobtrusive.adapters.add("mustbetrue", function (options) {
        setValidationValues(options, "mustbetrue", true);
    });

    $jQval.unobtrusive.parse();
</script>
于 2011-08-04T14:00:24.663 回答
3

不显眼的验证只会让我感到悲伤。

在一个非常简单的测试页面中,这是有效的:

$(document).ready(function () {
    jQuery.validator.unobtrusive.adapters.add(
        'mustbetrue', ['properties'], function (options) {
            options.rules['mustbetrue'] = options.params;
            options.messages['mustbetrue'] = options.message;
        }
        );

    jQuery.validator.addMethod('mustbetrue', function (value, element, params) {
        // check if dependency is met
        if (!this.depend(param, element)) {
            return "dependency-mismatch";
        }

        switch (element.type) {
            case "checkbox":
                return element.checked;
                break;
            case "hidden":
                return (value == 'true' || value == 'True');
                break;
            default:
                alert('type = ' + element.type);
                return true;
                break;
        }
    });
});

但是,当我将此代码移动到更复杂的形式时,它突然停止工作,我不知道为什么,也没有时间深入研究不显眼的代码来尝试找出答案。

辅导员本的解决方案适用于我更复杂的形式。

如果有人可以将我指向一个详细解释如何正确地将自定义验证器添加到不显眼的验证的站点,我将永远感激不尽。我访问的每个站点都有不同的解决方案。

于 2013-06-26T13:34:06.613 回答
1

我将此代码添加到外部 javascript 文件中没有问题,该文件是我从本网站窃取的

// Custom validator for checkboxs
jQuery.validator.unobtrusive.adapters.add("brequired", function (options) {    
    //bool-required for checkboxes    
    if (options.element.tagName.toUpperCase() == "INPUT" && 
        options.element.type.toUpperCase() == "CHECKBOX") 
    {
        options.rules["required"] = true;        
        if (options.message) {
            options.messages["required"] = options.message;
        }
    }
});

您确定将脚本放在页面中的 jquery 脚本之后吗?我的是列表中的最后一个。

于 2011-08-27T23:49:42.827 回答