1

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

4

2 回答 2

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,您可以为模型定义一个解决方法,如下所示(来源选择 Enum 类型的默认值而无需更改值):

[注意:您需要包括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>());
    }

}
于 2017-04-26T15:54:14.700 回答
-1

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

于 2017-04-26T20:17:36.353 回答