我有一个基于'int'的枚举属性的模型。我需要验证此属性不是空的。但是NotEmpty
禁止0
值。NotNull
只是不起作用,因为枚举属性不能为null。我无法使我的财产无效。我该如何进行此类验证?
只要枚举类型是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 :选择枚举类型的默认值而无需更改值(:
[注意:您需要包括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级别上做出的任何可能的选择,例如始终使用无效类型。当模型绑定尝试构建对象时,它匹配属性名称以请求键/值,并将匹配值设置为属性。当它在请求中找不到任何匹配时,它将属性留在其默认值为(如果在int的情况下为0(。在这种情况下,您必须知道用户是否将字段留为空或故意编写零值的唯一方法是检查模型状态。在第一种情况下,将在模型状态中跟踪错误(字段无法为null ...等(并检查模型状态您可以注意用户是否设置值。流利的验证在模型绑定后开始发挥作用,它依赖于模型活页夹本身和穷人的工作,他真的不明白零的真正含义(空/缺失值或零值(。