FlientValidation NotNull для значений перечисления
У меня есть модель со свойством enum, которое основано на 'int'. Мне нужно проверить, что это свойство не пустое. Но NotEmpty
запрещает 0
значение. А также NotNull
просто не работает, потому что свойство enum не может быть нулевым. Я не могу сделать свою собственность обнуляемой. Как я могу сделать такую проверку?
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>());
}
}
Я полагаю, вы хотите проверить модель в контроллере MVC, но вы должны быть более четкими о вашем контексте использования. Я думаю, что модель должна быть максимально широкой с точки зрения типов, чтобы соответствовать любому возможному выбору, который пользователь делает на уровне пользовательского интерфейса, например, всегда используя обнуляемые типы. Когда привязка модели пытается построить объект, он сопоставляет имена свойств, чтобы запросить ключи / значения и установить соответствующее значение в свойстве. Когда он не находит соответствия в запросе, он оставляет свойству значение по умолчанию (0 в случае int). В этом случае единственный способ узнать, оставил ли пользователь поле пустым или намеренно записал в него нулевое значение, - это проверить состояние модели. Что ж, в первом случае ошибка (поле не может быть нулевым... и т. Д.) Будет отслеживаться в состоянии модели, и при проверке состояния модели вы можете узнать, установил ли пользователь значение или нет. Свободная проверка вступает в игру после привязки модели, и она опирается на работу связующего устройства сама по себе, и бедный человек не может по-настоящему понять, что на самом деле означает ноль (пустое / отсутствующее значение или нулевое значение).