使用数据注释对属性子集进行强制验证

时间:2015-05-07 13:25:02

标签: c# validation data-annotations

我有一个包含三个字段的DTO模型。

[Range(1, 100000)]
public Decimal? BonusRate { get; set; }
[Range(1, 100000)]
public Decimal? BonusGain { get; set; }
[Range(1, 100)]
public Decimal? BonusPercentage { get; set; }

在我的情况下,所有字段都是可选字段,但如果设置了一个字段,则其他字段也应设置。我做出了一个决定并且运作良好,但看起来有点笨拙。

IEnumerable<ValidationResult> IValidatableObject.Validate(ValidationContext validationContext)
{
    if (BonusRate.HasValue || BonusGain.HasValue || BonusPercentage.HasValue)
        if (!BonusRate.HasValue || !BonusGain.HasValue || !BonusPercentage.HasValue)
             yield return new ValidationResult("message");

}

有人知道更好的方法吗?

2 个答案:

答案 0 :(得分:0)

if (BonusRate.HasValue == BonusGain.HasValue && BonusGain.HasValue == BonusPercentage.HasValue)

或收集列表中的值并:

var isChecked = list.All(x => (x == list.First()));

答案 1 :(得分:0)

经过一些研究和建议,我找到了一个总体策略。 您是否可以自由使用外部包裹?

  1. foolproof库添加到解决方案
  2. 创建一个只读属性 private static void Main(string[] args) { var config = new JobHostConfiguration("your connection string") { NameResolver = new QueueNameResolver() }; var host = new JobHost(config); host.RunAndBlock(); } public static void NewBidsQueue([QueueTrigger(%queueKey%)] string message, TextWriter log) { log.WriteLine(message); } ,如

    IsGroupRequired
  3. 为小组public Boolean IsGroupRequired { get { return GroupItem1.HasValue == GroupItem2.HasValue && GroupItem2.HasValue == GroupItem3.HasValue && GroupItemNminus1.HasValue == GroupItemN.HasValue; } } 的每个属性分配[RequiredIfTrue("IsGroupRequired")]

    1. 为您的模型实施GroupItem1..N界面
    2. 编写自己的验证方法

      IValidatableObject