2

在我的代码优先模型中,我有以下内容。

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

4

2 回答 2

3

这取决于你想做什么:

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

使您的布尔值可空:

[Required]
[Display(Name = "I agree to Participation Agreement")]
[NotMapped]
public bool? IsAgreementChecked { get; set; }

提出的解决方案正是您想要的。他们基本上创建了一个新的 DataAnnotation。对于现有的,这是不可能的。

目前,您的 required-attribute 只检查是否指定了值。由于布尔值是真或假,因此验证永远不会失败。

于 2013-05-08T17:32:59.587 回答
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.")]
于 2013-05-08T17:33:01.863 回答