必需的NotMapped布尔值无法正确验证

时间:2013-05-08 17:28:25

标签: asp.net-mvc entity-framework

在我的代码第一个模型中,我有以下内容。

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并尝试使用“创建”页面时。所有字段都正确验证,但忽略复选框。换句话说,该复选框不会触发任何类型的验证。有任何想法吗?感谢。

2 个答案:

答案 0 :(得分:3)

这取决于你想做什么:

  • 如果要检查是否指定了值(true或false):

使你的布尔为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.")]