如何指定必须至少选中一个复选框?

时间:2015-05-25 16:30:04

标签: asp.net-mvc data-annotations

我想使用DataAnnotation Attribute告诉用户他必须选中以下两个复选框组中的一个复选框。我的模特是:

//group T
public bool T0 {get;set;}
public bool T1 {get;set;}
public bool T2 {get;set;}
 //group P
public bool P0 {get;set;}
public bool P1 {get;set;}

用户必须至少选择一个T属性和一个P属性。在某些自定义数据注释中是否有某些功能可以执行此操作,或者我需要从beggining创建一个?

由于

4 个答案:

答案 0 :(得分:3)

您可以使用Fluent Validation

[FluentValidation.Attributes.Validator(typeof(CustomValidator))]
public class YourModel
{
    public bool T0 { get; set; }
    public bool T1 { get; set; }
    public bool T2 { get; set; }
}
public class CustomValidator : AbstractValidator<YourModel>
{
    public CustomValidator()
    {
        RuleFor(x => x.T0).NotEqual(false)
            .When(t => t.T1.Equals(false))
            .When(t => t.T2.Equals(false))
            .WithMessage("You need to select one");
    }
}

答案 1 :(得分:0)

这里有两种解决方案供您选择使用。

1.使用行动规则:

a)将“False”设置为复选框的默认值。 b)将以下操作规则添加到该复选框字段。

如果check_box_field =“False” 设置check_box_field(本身)=“true”

然后无法取消选中此字段。

2.使用验证规则。将以下验证规则添加到该复选框字段。

如果check_box_field =“False” 显示屏幕提示和消息:“需要检查”

使用此验证规则,如果未选中复选框,将显示验证错误并停止阻止表单提交。如果您有任何疑问,请与我联系。

答案 2 :(得分:0)

我发现这个解决方案按预期工作但我无法在视图上显示错误消息。

    [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
public class AtLeastOnePropertyAttribute : ValidationAttribute
{
    public AtLeastOnePropertyAttribute(string otherProperties)
    {
        if (otherProperties == null)
        {
            throw new ArgumentNullException("otherProperties");
        }
        OtherProperties = otherProperties;
    }

    public string OtherProperties { get; private set; }

    public string OtherPropertyDisplayName { get; internal set; }

    public override string FormatErrorMessage(string name)
    {
        return String.Format(CultureInfo.CurrentCulture, ErrorMessageString, name, OtherPropertyDisplayName ?? OtherProperties);

    }

    public override bool IsValid(object value)
    {
        var typeInfo = value.GetType();
        var propertiesToGet = OtherProperties.Split(',');
        var values = propertiesToGet.Select(propertyName => (bool) typeInfo.GetProperty(propertyName).GetValue(value)).ToList();

        return values.Any(v => v);
    }

    public override object TypeId
    {
        get
        {
            return new object();
        }
    }
}

在DTO课程中:

[AtLeastOneProperty("T0 ,T1,T2", ErrorMessage = @"At least one field should be marked as true.")]
[AtLeastOneProperty("P0,P1", ErrorMessage = @"At least one field should be marked as true.")]
public class TestDTO
{
     //Properties
}

答案 3 :(得分:0)

FluentValidation的另一种方式。

Timestamp('2019-11-11 11:00:00')

您还可以在复选框列表上运行foreach循环,并确认未选中所有复选框并抛出错误。