实体验证需要许多字段之一

时间:2014-01-13 21:26:03

标签: c# asp.net-mvc-4 entity-framework-5

我有一个有两个标志的实体,每个标志都有一个值。为了便于说明,我们将使用以下代码:

public partial class ExampleEntity
{
    public bool OptionA { get; set; }
    public int OptionAValue { get;set; }
    public bool OptionB { get; set; }
    public int OptionBValue { get;set; }
}

在使用的Webform上,如果未选中任何选项,则需要抛出一个标志。 如果选中了一个选项,则只需要/填充/评估相应的值。

现在我知道我可以使用[Required]标签和其他相关标签([Range(1,100)]),但我不确定如何对它们进行分组(如果可能)或在哪里添加逻辑根据输入的值确定是否需要A或B的值。

1 个答案:

答案 0 :(得分:0)

正如Pawel所说,您可以实现IValidatableObject接口(示例here

根据您的具体情况,您可以这样做:

public partial class ExampleEntity : IValidatableObject
{
    public bool OptionA { get; set; }
    public int OptionAValue { get;set; }
    public bool OptionB { get; set; }
    public int OptionBValue { get;set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (OptionA)
        {
            var aIsValid = PerformAValidation();
            if (!aIsValid)
            {
                yield return new ValidationResult("A was not valid", new[] {"OptionAValue", OptionAValue});
            }
        }

        if (OptionB)
        {
            var bIsValid = PerformBValidation();
            if (!bIsValid)
            {
                yield return new ValidationResult("B was not valid", new[] {"OptionBValue", OptionBValue});
            }
        }
    }

    private bool PerformAValidation()
    {
        if (OptionAValue < 100)
        {
            return false;
        }

        return true;
    }

    private bool PerformBValidation()
    {
        if (OptionBValue > 100)
        {
            return false;
        }

        return true;
    }
}

使用这些验证规则,OptionAValue需要小于100,OptionBValue需要大于100.