【问题标题】:RangeAttribute with Enum带枚举的 RangeAttribute
【发布时间】:2015-01-10 20:49:01
【问题描述】:

我有以下枚举:

public enum ApplicationLogTypes
    {
        Undefined = 0,
        Information = 100,
        Statistic = 200,
        Debug = 300,
        Security = 400,
        Error = 500
    }

我有一个带有 RangeAttribute Validation 的属性来强制用户没有选择默认选项“未定义”:

[Range(1, int.MaxValue, ErrorMessage = "Cannot select default option.")]
public ApplicationLogTypes ApplicationLogType { get; set; }

但是当我使用验证器时,它通过了:

public bool IsValid(ICollection<ValidationResult> results)
{
  bool isValid;
  ValidationContext validationContext = new ValidationContext(this);

  isValid = Validator.TryValidateObject(this, validationContext, results);

  return isValid;
}

使用此方法的其他验证正确地使使用其他属性(如必需)的验证失败。

有什么建议吗?

【问题讨论】:

    标签: c# validation data-annotations


    【解决方案1】:

    试试这个:

     isValid = Validator.TryValidateObject(this, validationContext, results, true);
    

    枚举没有问题,只是漏掉了最后一个参数——validateAllProperties 类型:System.Boolean true 验证所有属性;如果为 false,则仅验证必需的属性。

    【讨论】:

      【解决方案2】:

      解决方法建议:删除Undefined 枚举值。对未知值使用可空枚举类型和空值。然后你就可以使用所需的验证器了。

      可能的原因:您的值类型是枚举,但您指定了整数范围。尝试将枚举值指定为 min/max 或使用 RangeAttribute.OperandType

      【讨论】:

      • 有趣的方法,从来没有想过让枚举可以为空。知道为什么 Range 没有捕获 Undefined / 0 枚举吗?
      • 查看我的编辑,尽管我在这里不是 100% 确定。我认为如果你使用不匹配的类型应该是一个例外,你应该单独实例化一个 RangeAttribute 实例并手动调用它的 IsValid 方法来确保。
      猜你喜欢
      • 1970-01-01
      • 2020-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      相关资源
      最近更新 更多