Вариант 1: использовать пользовательский атрибут RequiredEnum и избегать атрибута JsonConverter
Не помещайте JsonConverter в перечисление AddressType. Этот StringToEnum не может отобразить строку. Пустое значение для перечисления, и он выдает это сообщение об ошибке.
Вместо этого вы можете написать собственный требуемый валидатор перечисления, как показано ниже.
using System;
using System.ComponentModel.DataAnnotations;
public class RequiredEnumFieldAttribute: RequiredAttribute
{
public override bool IsValid(object value)
{
if (value == null)
{
return false;
}
var type = value.GetType();
return type.IsEnum && Enum.IsDefined(type, value);
}
}
Тогда вы можете использовать его, как показано ниже:
public class AddressPostViewModel
{
[JsonProperty("addressType")]
[RequiredEnumField(ErrorMessage = "Address type is required.")]
public AddressType AddressType { get; set; }
}
Вариант 2. Использование настраиваемого JsonConverter для AddressType
Добавьте один пользовательский CustomStringToEnumConverter, производный от StringEnumConverter.
Этот метод выдаст ошибку, если значение в JSON будет пустым.
public class CustomStringToEnumConverter : StringEnumConverter
{
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (string.IsNullOrEmpty(reader.Value.ToString()))
throw new Exception("Address not provided");
return base.ReadJson(reader, objectType, existingValue, serializer);
}
}
Используйте этот jsonConverter вместо StringEnumConverter по умолчанию, как показано ниже
[JsonConverter(typeof(CustomStringToEnumConverter))]
public enum AddressType
{
}