Asp.net mvc 如何在mvc中添加布尔必需属性?
我有一个模型课,比如:Asp.net mvc 如何在mvc中添加布尔必需属性?,asp.net-mvc,validation,model,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; } [Req
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; }
}
公共班级学生
{
[数据类型(DataType.Date)]
[DisplayFormat(DataFormatString=“{0:yyyy-MM-dd}”,ApplyFormatInEditMode=true)]
[显示(Name=“注册日期”)]
公共日期时间注册日期{get;set;}
[必需]
[显示(Name=“处于活动状态”)]
公共bool IsActive{get;set;}
公共虚拟ICollection注册{get;set;}
}
在这里,我创建了一个带有Required
属性的Boolean
属性IsActive
,但问题是我的视图没有对此属性执行所需的验证?我想用复选框
绑定此属性,并检查是否选中此复选框
,如果未选中,则运行验证
有什么解决办法吗?谢谢上面的解决办法,它让我走上了正确的方向,但对我来说,效果并不好。我需要将下面的脚本添加到扩展jQueryValidator的页面,以使上述解决方案工作。如果有人遇到类似的问题,我想分享一下
[Display(Name = "Is Active")]
[Range(typeof(bool), "true", "true", ErrorMessage="The field Is Active must be checked.")]
public bool IsActive { get; set; }
<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>
//扩展jquery范围验证器以用于所需的复选框
var defaultRangeValidator=$.validator.methods.range;
$.validator.methods.range=函数(值、元素、参数){
如果(element.type==='checkbox'){
//如果是复选框,则选中后返回true
返回元素。已选中;
}否则{
//否则,运行默认的验证函数
返回defaultRangeValidator.call(this,value,element,param);
}
}
让我给Sonu K帖子添加一点内容
如果对其使用HTML验证(
),它可能会中断javascript,阻止您提交模型中的空必填字段集
最后,如果您不想在执行迁移时将激活
添加到数据库中(代码优先),只需添加[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,尽管它将在浏览器上显示uncheck,所以验证可能不会像您期望的那样工作,这就是为什么您必须添加此javascript代码来完善验证
<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>
//扩展jquery范围验证器以用于所需的复选框
var defaultRangeValidator=$.validator.methods.range;
$.validator.methods.range=函数(值、元素、参数){
如果(element.type==='checkbox'){
//如果是复选框,则选中后返回true
返回元素。已选中;
}否则{
//否则,运行默认的验证函数
返回defaultRangeValidator.call(this,value,element,param);
}
}
享受编码的乐趣这段代码是最近给我的:
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"
};
}
}
虽然我喜欢使用Range,但它很简单,代码也更少,上面的内容为您提供了一个对未来开发人员有意义的适当属性。不要认为您可以使用Required。看看这里。这可能有助于
Required
属性仅仅意味着属性必须有一个值。在布尔值(复选框)的情况下,值false(或unchecked)仍然是一个有效的答案。我知道这一事实,它不起作用,因为unchecked也是布尔属性的有效值,这就是为什么我要寻找解决方案。我想知道是否可以在MVC中使用默认数据注释?@SonuK您可以使用自定义验证属性来完成。阅读我添加的链接Hanks,这很有效。避免创建单独验证方法的有趣解决方法。
$.validator.unobtrusive.adapters.addBool("booleanrequired", "required");