我有一个模型类,如:
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
并运行验证(如果不是)。
对此有何解决方案?
答案 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的想法,但它简单易行,代码更少,以上内容为您提供了对将来的开发人员有意义的适当属性。