如何在mvc中添加布尔必需属性?

时间:2014-09-30 13:32:00

标签: asp.net-mvc validation model

我有一个模型类,如:

public class Student
{
    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    [Display(Name = "Enrollment Date")]
    public DateTime EnrollmentDate { get; set; }

    [Required]
    [Display(Name = "Is Active")]
    public bool IsActive { get; set; }

    public virtual ICollection<Enrollment> Enrollments { get; set; }
}

这里我创建了一个Boolean属性IsActive,其Required属性,但问题是我的视图没有执行此属性所需的验证?我想将此属性与CheckBox绑定,并检查是否已选中此CheckBox并运行验证(如果不是)。

对此有何解决方案?

4 个答案:

答案 0 :(得分:61)

[Display(Name = "Is Active")]
[Range(typeof(bool), "true", "true", ErrorMessage="The field Is Active must be checked.")]
public bool IsActive { get; set; }

答案 1 :(得分:22)

感谢上述解决方案,这使我处于正确的方向,但对我而言,它并没有奏效。我需要将以下脚本添加到扩展jquery验证器的页面以使上述解决方案工作。想要分享这个,如果有人遇到类似的问题。

<script>
        // extend jquery range validator to work for required checkboxes
        var defaultRangeValidator = $.validator.methods.range;
        $.validator.methods.range = function(value, element, param) {
            if(element.type === 'checkbox') {
                // if it's a checkbox return true if it is checked
                return element.checked;
            } else {
                // otherwise run the default validation function
                return defaultRangeValidator.call(this, value, element, param);
            }
        }
</script>

答案 2 :(得分:2)

让我添加一点Sonu K帖子

如果您对其使用HTML验证(<input type="checkbox" required/>),最终可能会中断您的javascript,导致您无法从模型中提交空的必填字段集

最后,如果您不希望在迁移时将Is Active添加到数据库(代码优先),只需添加[NotMapped]

完整代码

[NotMapped]
[Display(Name = "Is Active")]
[Range(typeof(bool), "true", "true", ErrorMessage="The field Is Active must be checked.")]
public bool IsActive { get; set; }

因为它在MVC中默认设置为true,尽管它会在浏览器上显示取消选中,因此验证可能无法正常工作,这就是为什么你必须添加这个javascript代码来完善验证。< / p>

<script>
            // extend jquery range validator to work for required checkboxes
            var defaultRangeValidator = $.validator.methods.range;
            $.validator.methods.range = function(value, element, param) {
                if(element.type === 'checkbox') {
                    // if it's a checkbox return true if it is checked
                    return element.checked;
                } else {
                    // otherwise run the default validation function
                    return defaultRangeValidator.call(this, value, element, param);
                }
            }
        </script>

享受编码

答案 3 :(得分:1)

此代码是最近给我的:

public class BooleanRequiredAttribute : ValidationAttribute, IClientValidatable
    {
        public override bool IsValid(object value)
        {
            return value is bool && (bool)value;
        }



        public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
        {
            yield return new ModelClientValidationRule
            {
                ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()),
                ValidationType = "booleanrequired"
            };
        }
    }

然后在定义验证js之后将以下内容添加到位:

$.validator.unobtrusive.adapters.addBool("booleanrequired", "required");

尽管我喜欢使用Range的想法,但它简单易行,代码更少,以上内容为您提供了对将来的开发人员有意义的适当属性。