Asp.net mvc 3 MVC对复选框进行不引人注目的验证不起作用

Asp.net mvc 3 MVC对复选框进行不引人注目的验证不起作用,asp.net-mvc-3,razor,unobtrusive-javascript,unobtrusive-validation,Asp.net Mvc 3,Razor,Unobtrusive Javascript,Unobtrusive Validation,我正在尝试实现中提到的代码。换句话说,我正试图在条款和条件复选框上实现不引人注目的验证。如果用户未选中复选框,则应将输入标记为无效 这是服务器端验证程序代码,我添加了: /// <summary> /// Validation attribute that demands that a boolean value must be true. /// </summary> [AttributeUsage(AttributeTargets.Property, AllowMul

我正在尝试实现中提到的代码。换句话说,我正试图在条款和条件复选框上实现不引人注目的验证。如果用户未选中复选框,则应将输入标记为无效

这是服务器端验证程序代码,我添加了:

/// <summary>
/// Validation attribute that demands that a boolean value must be true.
/// </summary>
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
public class MustBeTrueAttribute : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        return value != null && value is bool && (bool)value;
    }
}
我的看法是:

@Html.EditorFor(x => x.AcceptTermsAndConditions)
@Html.LabelFor(x => x.AcceptTermsAndConditions)
@Html.ValidationMessageFor(x => x.AcceptTermsAndConditions)
这是我用来连接验证器客户端的jQuery:

$.validator.unobtrusive.adapters.addBool("mustbetrue", "required");
然而,客户端脚本似乎没有起作用。每当我按下submit按钮时,其他字段的验证都会启动,但是条款和条件的验证似乎没有启动。这就是我单击submit按钮后Firebug中代码的外观

<input type="checkbox" value="true" name="AcceptTermsAndConditions" id="AcceptTermsAndConditions" data-val-required="The I confirm that I am authorised to join this website and I accept the terms and conditions field is required." data-val="true" class="check-box">
<input type="hidden" value="false" name="AcceptTermsAndConditions">
<label for="AcceptTermsAndConditions">I confirm that I am authorised to join this website and I accept the terms and conditions</label>
<span data-valmsg-replace="true" data-valmsg-for="AcceptTermsAndConditions" class="field-validation-valid"></span>

本人确认本人已获授权加入本网站,并接受条款和条件
有什么想法吗?我漏了一步吗?这简直要把我逼疯了

提前谢谢 S

您需要在自定义属性上实现,以便将您在客户端注册的
mustbetrue
适配器名称与此属性绑定:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
public class MustBeTrueAttribute : ValidationAttribute, IClientValidatable
{
    public override bool IsValid(object value)
    {
        return value != null && value is bool && (bool)value;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        yield return new ModelClientValidationRule
        {
            ErrorMessage = this.ErrorMessage,
            ValidationType = "mustbetrue"
        };
    }
}
控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new MyViewModel();
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        return View(model);
    }
}
视图:

@model MyViewModel
$.validator.unobtrusive.adapters.addBool(“mustbetrue”,“required”);
@使用(Html.BeginForm())
{
@CheckBoxFor(x=>x.AcceptsTerms)
@LabelFor(x=>x.AcceptsTerms)
@Html.ValidationMessageFor(x=>x.AcceptsTerms)
}
嗅探器

除了实现Darin的解决方案外,还需要修改文件
jquery.validate.unobtrusive.js
。在此文件中,必须添加“mustbetrue”验证方法,如下所示:

$jQval.addMethod("mustbetrue", function (value, element, param) {
    // check if dependency is met
    if (!this.depend(param, element))
        return "dependency-mismatch";
    return element.checked;
});
然后(我一开始忘了添加这个),您还必须将以下内容添加到
jquery.validate.unobtrusive.js

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

辅导员本

我不确定为什么这对我不起作用,但我选择使用您的代码并做一些稍微不同的事情

在我的JavaScript加载中,我添加了以下内容,如果您选择复选框并取消选中复选框,则复选框将触发非恶意验证。此外,如果您提交表格

$(function () {
        $(".checkboxonblurenabled").change(function () {
            $('form').validate().element(this);
        });
});
您还需要将CSS类添加到复选框中,如下所示

@Html.CheckBoxFor(model => model.AgreeToPrivacyPolicy, new { @class = "checkboxonblurenabled"})
因此,我们现在需要连接模型并放入out类来处理服务器端验证(我从上面开始使用),但要稍微改变不引人注目的地方

下面是扩展IClientValidate的customer属性,如上例所示

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
public class MustBeTrueAttribute : ValidationAttribute, IClientValidatable
{
    public override bool IsValid(object value)
    {
        return value != null && value is bool && (bool)value;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        yield return new ModelClientValidationRule
        {
            ErrorMessage = this.ErrorMessage,
            ValidationType = "mustbetrue"
        };
    }
}
好了,我们准备好加入JavaScript了

(function ($) {
    /*
    START CHECK MUST BE TRUE - UNOBTRUSIVE JAVASCRIPT
    START CHECK MUST BE TRUE - UNOBTRUSIVE JAVASCRIPT
    START CHECK MUST BE TRUE - UNOBTRUSIVE JAVASCRIPT
    */
    jQuery.validator.unobtrusive.adapters.add("mustbetrue", ['maxint'], function (options) {
        options.rules["mustbetrue"] = options.params;
        options.messages["mustbetrue"] = options.message;
    });

    jQuery.validator.addMethod("mustbetrue", function (value, element, params) {

        if ($(element).is(':checked')) {
            return true;
        }
        else {
            return false;
        }
    });
    /*
    START CHECK MAX INT - UNOBTRUSIVE JAVASCRIPT
    START CHECK MAX INT - UNOBTRUSIVE JAVASCRIPT
    START CHECK MAX INT - UNOBTRUSIVE JAVASCRIPT
    */



} (jQuery));

是什么使这项工作,是。。。好。在尝试执行上述建议的答案后查看HTML标记后,我的值都设置为true,但是我的复选框为false。因此,我决定让jQuery使用IsChecked来解决这些解决方案都不起作用的问题:

我正在使用.NETFramework4和最新的jquery验证脚本文件使用RazorMVC4

在客户端和服务器端实现自定义属性验证后,它仍然不起作用。不管怎样,我的表格正在邮寄中

因此,这里是一个陷阱: JQuery validate脚本有一个默认设置,即忽略隐藏的标记(如果隐藏),这通常不是问题,但我使用的@Html.CheckBoxFor样式是使用CSS3样式自定义的,该样式将显示更改为无,并显示复选框的自定义图像,因此它将永远不会对复选框执行验证规则

我的解决方法是在自定义客户端验证规则声明之前添加此行:

$.validator.defaults.ignore = "";
它所做的是覆盖当前页面中所有验证的忽略设置,请注意,现在它也可以在隐藏字段上执行验证(一个副作用)。


$(函数(){
$('#btnconfirm')。单击(函数(){
if($(“#chk”).attr('checked')!==未定义){
返回true;
}
否则{
警告(“请选中复选框”);
返回false;
}
});
});
我阅读并接受注册条款和条件
//
///小结:-复选框或输入类型检查所需验证不起作用根本原因和解决方案如下
///
///问题:
///这个问题的关键在于解释jQuery验证“必需”规则。我稍微挖掘了一下,在jquery.validate.unobtrusive.js文件中找到了一个特定的代码:
///适配器。添加(“必需”,功能(选项){
///if(options.element.tagName.toUpperCase()!=“输入”| | options.element.type.toUpperCase()!=“复选框”){
///setValidationValues(选项“必需”,真);
///    }
///   });
///   
///修复:(Jquery脚本页面级修复添加到复选框必填区域)
///jQuery.validator.unobtrusive.adapters.add(“brequired”),函数(选项){
///if(options.element.tagName.toUpperCase()=“输入”&&options.element.type.toUpperCase()=“复选框”){
///选项。规则[“必需”]=true;
///if(options.message){
///options.messages[“required”]=options.message;
///                       }
///修正:(MVC验证的C代码)
///您可以看到它继承自common RequiredAttribute。此外,它实现了IClientValidatable。这是为了确保规则也将传播到客户端(jQuery验证)。
///  
///注释示例:
///[需要布尔值]
///公共布尔iAgree{get;set'}
///    
/// 
公共类BooleanRequired:RequiredAttribute,IClientValidable
{
公共布尔值()
{
}
公共覆盖布尔值有效(对象值)
{
返回值!=null&(bool)值==true;
}
公共IEnumerable GetClientValidationRules(ModelMetadata元数据、ControllerContext上下文)
{
返回新的ModelClientValidationRule[]{new ModelClientValidationRule(){ValidationType=“brequired”,ErrorMessage=this.ErrorMessage};
}
}
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
public class MustBeTrueAttribute : ValidationAttribute, IClientValidatable
{
    public override bool IsValid(object value)
    {
        return value != null && value is bool && (bool)value;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        yield return new ModelClientValidationRule
        {
            ErrorMessage = this.ErrorMessage,
            ValidationType = "mustbetrue"
        };
    }
}
 [MustBeTrue(ErrorMessage = "Confirm you have read and agree to our privacy policy")]
    [Display(Name = "Privacy policy")]
    public bool AgreeToPrivacyPolicy { get; set; }
(function ($) {
    /*
    START CHECK MUST BE TRUE - UNOBTRUSIVE JAVASCRIPT
    START CHECK MUST BE TRUE - UNOBTRUSIVE JAVASCRIPT
    START CHECK MUST BE TRUE - UNOBTRUSIVE JAVASCRIPT
    */
    jQuery.validator.unobtrusive.adapters.add("mustbetrue", ['maxint'], function (options) {
        options.rules["mustbetrue"] = options.params;
        options.messages["mustbetrue"] = options.message;
    });

    jQuery.validator.addMethod("mustbetrue", function (value, element, params) {

        if ($(element).is(':checked')) {
            return true;
        }
        else {
            return false;
        }
    });
    /*
    START CHECK MAX INT - UNOBTRUSIVE JAVASCRIPT
    START CHECK MAX INT - UNOBTRUSIVE JAVASCRIPT
    START CHECK MAX INT - UNOBTRUSIVE JAVASCRIPT
    */



} (jQuery));
$.validator.defaults.ignore = "";
<script>
    $(function () {
        $('#btnconfirm').click(function () {
            if ($("#chk").attr('checked') !== undefined ){
                return true;
            }
            else {

                alert("Please Select Checkbox ");
                return false;
            }
        });

    });
</script>
<div style="float: left">
                    <input type="checkbox" name="chk" id="chk"  />
                    I read and accept the terms and Conditions of registration
                </div>
  <input type="submit" value="Confirm"  id="btnconfirm" />
/// <summary> 
///  Summary : -CheckBox for or input type check required validation is not working the root cause and solution as follows
///
///  Problem :
///  The key to this problem lies in interpretation of jQuery validation 'required' rule. I digged a little and find a specific code inside a jquery.validate.unobtrusive.js file:
///  adapters.add("required", function (options) {
///  if (options.element.tagName.toUpperCase() !== "INPUT" || options.element.type.toUpperCase() !== "CHECKBOX") {
///    setValidationValues(options, "required", true);
///    }
///   });
///   
///  Fix: (Jquery script fix at page level added in to check box required area)
///  jQuery.validator.unobtrusive.adapters.add("brequired", function (options) {
///   if (options.element.tagName.toUpperCase() == "INPUT" && options.element.type.toUpperCase() == "CHECKBOX") {
///              options.rules["required"] = true;
///   if (options.message) {
///                   options.messages["required"] = options.message;
///                       }
///  Fix : (C# Code for MVC validation)
///  You can see it inherits from common RequiredAttribute. Moreover it implements IClientValidateable. This is to make assure that rule will be propagated to client side (jQuery validation) as well.
///  
///  Annotation example :
///   [BooleanRequired]
///   public bool iAgree { get; set' }
///    

/// </summary>


public class BooleanRequired : RequiredAttribute, IClientValidatable
{

    public BooleanRequired()
    {
    }

    public override bool IsValid(object value)
    {
        return value != null && (bool)value == true;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        return new ModelClientValidationRule[] { new ModelClientValidationRule() { ValidationType = "brequired", ErrorMessage = this.ErrorMessage } };
    }
}