在我的代码第一个模型中,我有以下内容。
public class Agreement
{
[Key]
[ForeignKey("AppRegistration")]
public int AppRegistrationId { get; set; }
[Required]
[Display(Name = "I agree to Participation Agreement")]
[NotMapped]
public bool IsAgreementChecked { get; set; }
public DateTime DateAgreed { get; set; }
public AppRegistration AppRegistration { get; set; }
}
我已将IsAgreementChecked
标记为NotMapped
,因为我只想在用户点击“同意”复选框时存储DateTime
。
当我基于此模型生成Controller
并尝试使用“创建”页面时。所有字段都正确验证,但忽略复选框。换句话说,该复选框不会触发任何类型的验证。有任何想法吗?感谢。
答案 0 :(得分:3)
这取决于你想做什么:
使你的布尔为Nullable:
[Required]
[Display(Name = "I agree to Participation Agreement")]
[NotMapped]
public bool? IsAgreementChecked { get; set; }
提出的解决方案完全符合您的要求。它们基本上创建了一个新的DataAnnotation。对于现有的,这是不可能的。
目前,您的required-attribute只检查是否指定了值。由于布尔值为true或false,因此验证永远不会失败。
答案 1 :(得分:1)
这是一篇描述如何执行此操作的博文:
http://blog.degree.no/2012/03/validation-of-required-checkbox-in-asp-net-mvc/
以下代码来自此帖子
基本上,您可以创建自定义ValidationAttribute
public class BooleanRequiredAttribute : ValidationAttribute, IClientValidatable
{
public override bool IsValid(object value)
{
if (value is bool)
return (bool)value;
else
return true;
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(
ModelMetadata metadata,
ControllerContext context)
{
yield return new ModelClientValidationRule
{
ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()),
ValidationType = "booleanrequired"
};
}
}
然后将其应用于您的模型,而不是[Required]
属性。
[BooleanRequired(ErrorMessage = "You must accept the terms and conditions.")]