C# 客户端两次触发CheckBox的MVC 3自定义验证属性

C# 客户端两次触发CheckBox的MVC 3自定义验证属性,c#,validation,asp.net-mvc-3,jquery-validate,C#,Validation,Asp.net Mvc 3,Jquery Validate,我将列出代码来解释整个情况,然后提出问题的描述: 在我的视图模型中,我有一个布尔属性来跟踪用户是否接受术语: [MustBeTrue(ErrorMessageResourceType = typeof(ErrorMessages), ErrorMessageResourceName = "MustAccept")] public bool HasAuthorizedBanking { get; set; } 如您所见,我创建了一个自定义验证属性来处理这个复选框,称为MustBeTrue,因

我将列出代码来解释整个情况,然后提出问题的描述:

在我的视图模型中,我有一个布尔属性来跟踪用户是否接受术语:

 [MustBeTrue(ErrorMessageResourceType = typeof(ErrorMessages), ErrorMessageResourceName = "MustAccept")]
 public bool HasAuthorizedBanking { get; set; }
如您所见,我创建了一个自定义验证属性来处理这个复选框,称为MustBeTrue,因为[Required]是

为了实现这个客户端,我创建了一个jQuery验证器方法,并添加了一个不引人注目的适配器:

// Checkbox Validation
jQuery.validator.addMethod("checkrequired", function (value, element) {
    var checked = false;
    checked = $(element).is(':checked');
    return checked;
}, '');

jQuery.validator.unobtrusive.adapters.addBool("truerequired", "checkrequired");
在我看来,注册过程中的所有步骤都在一个页面上,元素通过jQuery隐藏和显示,并使用jQuery验证进行验证。单击“下一步”按钮时,会触发页面上的每个输入元素进行验证:

 var validator = $("#WizardForm").validate(); // obtain validator
    var anyError = false;
    $step.find("input").each(function () {
        if (!validator.element(this)) { // validate every input element inside this step
            anyError = true;
        }

    });

    if (anyError)
        return false;
注意事项:

  • 在我的模型中只有一个属性具有MustBeTrue属性,并且在整个页面上只有一个CheckBoxFor&匹配ValidationMessageFor
  • 为了跟踪何时调用此方法,我只需发出警报(选中);在jQuery验证程序方法“checkrequired”中
问题:选中/取消选中复选框时,将触发一次“checkrequired”方法。但是,当单击“下一步”按钮并开始验证所有输入元素时,无论是否选中复选框,都会触发两次。有趣的是,如果选中,第一个验证将返回true,第二个验证将返回false(第二个false返回是我的主要问题-页面将不会验证,并且不允许您继续下一步)。此外,当选中它并单击“下一步”时,ValidationMessageFor消息将消失,就好像它是有效的一样


编辑:我有另一个自定义属性用于验证jQuery DatePicker文本框中的年龄,虽然它是以完全相同的方式实现的,但在相同的条件下只触发一次。

问题是Html生成了与复选框同名的第二个输入元素。CheckBoxFor,如下所述:

// Checkbox Validation
jQuery.validator.addMethod("checkrequired", function (value, element) {
    var checked = false;
    checked = $(element).is(':checked');
    return checked;
}, '');

jQuery.validator.unobtrusive.adapters.addBool("truerequired", "checkrequired");
 var validator = $("#WizardForm").validate(); // obtain validator
    var anyError = false;
    $step.find("input").each(function () {
        if (!validator.element(this)) { // validate every input element inside this step
            anyError = true;
        }

    });

    if (anyError)
        return false;
<input data-val="true" data-val-required="The HasAuthorizedBanking field is required." data-val-truerequired="You must accept to continue." id="bankingtermscheckbox" name="HasAuthorizedBanking" type="checkbox" value="true" />
<input name="HasAuthorizedBanking" type="hidden" value="false" />
$step.find(':input:not(:hidden)').each(function () { // Select all input elements except those that are hidden
        if (!validator.element(this)) { // validate every input element inside this step
            anyError = true;
        }

    });

    if (anyError)
        return false; // exit if any error found