Jquery Asp.NETMVC和自定义的不引人注目的验证

Jquery Asp.NETMVC和自定义的不引人注目的验证,jquery,asp.net-mvc,unobtrusive-validation,Jquery,Asp.net Mvc,Unobtrusive Validation,我正试图让一个自定义规则“必须正确”起作用。大致基于: 我的问题是,当我提交表单时,客户端验证没有给我一个错误(没有显示验证文本)。 此外,我在jscript验证方法中设置了一个断点,它永远不会被触发。添加适配器的wireup代码确实会被触发。控制台中没有错误 我做错了什么 这是我在服务器端所拥有的: public class MustBeTrueAttribute : ValidationAttribute, IClientValidatable { public override b

我正试图让一个自定义规则“必须正确”起作用。大致基于: 我的问题是,当我提交表单时,客户端验证没有给我一个错误(没有显示验证文本)。 此外,我在jscript验证方法中设置了一个断点,它永远不会被触发。添加适配器的wireup代码确实会被触发。控制台中没有错误

我做错了什么

这是我在服务器端所拥有的:

public class MustBeTrueAttribute : ValidationAttribute, IClientValidatable
{
    public override bool IsValid(object value)
    {
        if (value == null) return false;
        try
        {
            return Convert.ToBoolean(value);
        }
        catch (InvalidCastException)
        {
            return false;
        }
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata,
                                                                           ControllerContext context)
    {
        yield return new ModelClientValidationRule
            {
                ErrorMessage = this.ErrorMessage,
                ValidationType = "mustbetrue"
            };
    }
}
在物体上:

[MustBeTrue(ErrorMessageResourceName = "Register_TermsNotAccepted", ErrorMessageResourceType = typeof(Resources.Global))]
public bool AcceptedTerms { get; set; }
客户端:

$(document).ready(function () {
    jQuery.validator.addMethod("mustbetrue", function (value, element) {
        if (!this.depend(param, element))
            return "dependency-mismatch";
        return element.checked;
    });
    jQuery.validator.unobtrusive.adapters.addBool("mustbetrue", "mustbetrue");
});
以及输出的相关HTML:

<input data-val="true" data-val-mustbetrue="You must accept the terms and conditions" data-val-required="The AcceptedTerms field is required." id="AcceptedTerms" name="AcceptedTerms" type="checkbox" value="true" class="valid">


如果您已经检查了是否启用了客户端验证(无论是在配置中还是在代码中),那么我猜这是因为您正在添加适配器,在不引人注目的验证脚本解析html后才不会偏离总体目标,但是复选框上是否需要
就足够了?未选中的复选框不会通过网络发送,是吗(因此强制执行
必需的
)?是的,我听说人们说它可以工作,而无需添加新规则。然而,在实践中,我从来没有让它工作。即使在1或4处添加了“最小-最大”的组合。@由于非空布尔值总是有一个值,即False或True,因此它总是满足所需的属性。这里需要的不是必需的属性,而是确保它与某个值匹配的验证。Required只检查值是否存在,而不关心该值是否为0、1、true、false等。
$(document).ready(function () {
    jQuery.validator.addMethod("mustbetrue", function (value, element) {
        if (!this.depend(param, element))
            return "dependency-mismatch";
        return element.checked;
    });
    jQuery.validator.unobtrusive.adapters.addBool("mustbetrue", "mustbetrue");
});
<input data-val="true" data-val-mustbetrue="You must accept the terms and conditions" data-val-required="The AcceptedTerms field is required." id="AcceptedTerms" name="AcceptedTerms" type="checkbox" value="true" class="valid">