MVC将方法添加到jquery.validate.unobtrusive.js中

时间:2011-08-04 13:16:13

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

我最近在MVC项目中的客户端getting checkbox validation working上有一个问题。这个问题已成功回答,但提出了另一个问题。

为了让我的复选框验证工作,我需要将以下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);
});

这很好用,但我不满意不得不改变这个文件以防万一微软或验证插件男孩将来更新文件。如果我还没有在项目上工作,那么这个文件可能会被覆盖而没有人意识到它已被定制。

因此,考虑到这一点,我尝试将其添加到外部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);
});

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

提前致谢

取值

3 个答案:

答案 0 :(得分:10)

嗅探器,

我看得越多,我就越摇头(对自己)。

经过进一步审核,只要你在他的页面脚本中添加一行,Darin的方法就可以了:

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

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

counsellorben

P.S。这解决了您的问题,但仍未解决如何在不修改jquery.validate.js的情况下添加其他未使用jquery.validate.unobtrusive.js内置方法的自定义验证程序的问题。

P.P.S。我找到了添加自定义验证方法的答案。为了在不修改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>

答案 1 :(得分: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;
        }
    });
});

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

counsellorben的解决方案以我更复杂的形式运作。

如果有人能指出我的网站详细解释如何正确添加自定义验证器以进行不引人注目的验证,我将永远是伟大的。我访问的每个站点都有不同的解决方案。

答案 2 :(得分:0)

将此代码添加到外部javascript文件中我没有问题,我从This site

中窃取了该文件
// 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脚本之后吗?我是列表中的最后一个。