枚举值上的 FluentValidation NotNull

FluentValidation NotNull on enum values

我有一个基于 'int' 的带有枚举 属性 的模型。 我需要验证此 属性 是否为空。但是 NotEmpty 禁止 0 值。 NotNull 只是不起作用,因为枚举 属性 不能为空。 我不能让我的 属性 可以为空。 我怎样才能做这样的验证?

只要枚举类型是 int 就可以执行以下操作:

public class Status
    {
        public StatusType type { get; set; }
    }

    public enum StatusType
    {
        open = 1,
        closed = 2
    }

    public class StatusValidator : AbstractValidator<Status>
    {
        public StatusValidator()
        {
            RuleFor(x => x.type).Must(x => x != 0);
        }

    }

如果您无法避免 0,您可以为模型定义一个解决方法,如下所示 (source: Choosing the default value of an Enum type without having to change values):

[注意:需要包含using System.ComponentModel;]

public class Status
{
    public StatusType type { get; set; }
}

[DefaultValue(_default)]
public enum StatusType
{
    _default = -1,
    test = 0,
    open = 1,
    closed = 2,

}

public static class Utilities
{
    public static TEnum GetDefaultValue<TEnum>() where TEnum : struct
    {
        Type t = typeof(TEnum);
        DefaultValueAttribute[] attributes = (DefaultValueAttribute[])t.GetCustomAttributes(typeof(DefaultValueAttribute), false);
        if (attributes != null &&
            attributes.Length > 0)
        {
            return (TEnum)attributes[0].Value;
        }
        else
        {
            return default(TEnum);
        }
    }
}

public class StatusValidator : AbstractValidator<Status>
{
    public StatusValidator()
    {
        RuleFor(x => x.type).Must(x => x != Utilities.GetDefaultValue<StatusType>());
    }

}

我想你想在 mvc 控制器中验证模型,但你应该更清楚你的使用环境。 我认为模型在类型方面应该尽可能广泛,以适应用户在 UI 级别做出的任何可能选择,例如始终使用可为 null 的类型。当模型绑定尝试构建对象时,它匹配 属性 名称以请求 keys/values 并将匹配值设置到 属性 中。当它在请求中找不到任何匹配项时,它会将 属性 保留为其默认值(在 int 的情况下为 0)。在这种情况下,您必须知道用户是否将该字段留空或故意在其中写入零值的唯一方法是检查模型状态。那么在第一种情况下,将在模型状态中跟踪错误(字段不能为空...等)并检查模型状态,您可以知道用户是否设置了该值。 Fluent 验证在模型绑定后开始发挥作用,它依赖于模型绑定器本身的工作,可怜的他无法真正理解零的真正含义(empty/missing 值或零值)。