枚举值上的FlientValidation NotNull

时间:2017-04-26 13:28:31

标签: fluentvalidation fluentvalidation-2.0

我有一个带有enum属性的模型,该属性基于'int'。 我需要验证此属性不为空。但NotEmpty禁止0值。而NotNull只是不起作用,因为枚举属性不能为空。 我不能让我的财产可以为空。 我该如何进行此类验证?

2 个答案:

答案 0 :(得分:2)

只要枚举类型为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,则可以按照以下方式为模型定义解决方法(来源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>());
    }

}

答案 1 :(得分:-1)

我想你想在mvc控制器中验证模型,但你应该更清楚你的利用率上下文。 我认为模型应该在类型方面尽可能宽,以适应用户在UI级别做出的任何可能的选择,例如总是使用可空类型。当模型绑定尝试构建对象时,它匹配属性名称以请求键/值并将匹配值设置为属性。当它在请求中找不到任何匹配时,它会将属性保留为其默认值(如果为int,则为0)。在这种情况下,您必须知道用户是否将字段留空或故意在其中写入零值的唯一方法是检查模型状态。那么在第一种情况下,将在模型状态中跟踪错误(字段不能为空等等)并检查模型状态,如果用户设置了值,则可以知道。模型绑定后,流畅的验证发挥作用,它依赖于模型绑定器itselfe的工作,而他很难理解零的真正含义(空/缺失值或零值)。