4 回答

TA貢獻1836條經驗 獲得超13個贊
選項 1:使用自定義 RequiredEnum 屬性并避免 JsonConverter 屬性
不要將 JsonConverter 放在 AddressType 枚舉上。此 StringToEnum 無法將 string.Empty 映射到枚舉值,并拋出此錯誤消息。
取而代之的是,您可以編寫一個自定義的必需枚舉驗證器,如下所示。
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:對 AddressType 使用自定義 JsonConverter
添加一個從 StringEnumConverter 派生的自定義 CustomStringToEnumConverter。
如果 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
{
}

TA貢獻1846條經驗 獲得超7個贊
我想出了一個滿足我要求的解決方案,盡管代碼讓我有點畏縮。
我將屬性保留在視圖模型中的[Required]屬性上。AddressType令人畏懼的部分是我必須制作該財產nullable:
public class AddressPostViewModel
{
[JsonProperty("addressType")]
[Required(ErrorMessage = "Address type is required.")]
public AddressType? AddressType { get; set; }
}
在AttributeType枚舉本身上,我用@Manoj Choudhari 建議StringEnumConverter的自定義替換了屬性:JsonConverter
[JsonConverter(typeof(CustomStringToEnumConverter))]
public enum AddressType
{
[EnumMember(Value = "Dropship")]
Dropship,
[EnumMember(Value = "Shipping")]
Shipping
}
這是CustomStringToEnumConverter:
public class CustomStringToEnumConverter : StringEnumConverter
{
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (string.IsNullOrEmpty(reader.Value?.ToString()))
{
return null;
}
object parsedEnumValue;
var isValidEnumValue = Enum.TryParse(objectType.GenericTypeArguments[0], reader.Value.ToString(), true, out parsedEnumValue);
if (isValidEnumValue)
{
return parsedEnumValue;
}
else
{
return null;
}
}
}
CustomStringToEnumConverter可以處理空字符串、空值和無效字符串。如果遇到無效的枚舉值,它會返回null,然后在發生必填字段驗證(魔術)時捕獲該值,并RequiredAttribute在 JSON 響應中顯示錯誤消息。
雖然我不喜歡將類型設為可為空,但如果請求 JSON 中的值錯誤AttributeType,我的 API 使用者將看到一致的驗證消息。AttributeType

TA貢獻1817條經驗 獲得超6個贊
我認為沒有開箱即用的數據注釋來驗證枚舉值。
不過,您可以從 required 屬性派生:
using System;
using System.ComponentModel.DataAnnotations;
public class RequiredEnumAttribute : RequiredAttribute
{
public override bool IsValid(object value)
{
if (value == null) return false;
var type = value.GetType();
return type.IsEnum && Enum.IsDefined(type, value);
}
}
該Enum.IsDefined方法正在檢查給定value的枚舉中是否存在給定type。
用法:
[RequiredEnum(ErrorMessage = "Your error message.")]
public YourEnum EnumProperty { get; set; }
見這篇文章。
- 4 回答
- 0 關注
- 290 瀏覽
添加回答
舉報