4 回答

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超13個(gè)贊
選項(xiàng) 1:使用自定義 RequiredEnum 屬性并避免 JsonConverter 屬性
不要將 JsonConverter 放在 AddressType 枚舉上。此 StringToEnum 無法將 string.Empty 映射到枚舉值,并拋出此錯(cuò)誤消息。
取而代之的是,您可以編寫一個(gè)自定義的必需枚舉驗(yàn)證器,如下所示。
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; }
}
選項(xiàng) 2:對(duì) AddressType 使用自定義 JsonConverter
添加一個(gè)從 StringEnumConverter 派生的自定義 CustomStringToEnumConverter。
如果 JSON 中的值為空,此方法將引發(fā)錯(cuò)誤。
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);
}
}
使用這個(gè) jsonConverter 而不是默認(rèn)的 StringEnumConverter 如下所示
[JsonConverter(typeof(CustomStringToEnumConverter))]
public enum AddressType
{
}

TA貢獻(xiàn)1846條經(jīng)驗(yàn) 獲得超7個(gè)贊
我想出了一個(gè)滿足我要求的解決方案,盡管代碼讓我有點(diǎn)畏縮。
我將屬性保留在視圖模型中的[Required]屬性上。AddressType令人畏懼的部分是我必須制作該財(cái)產(chǎn)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可以處理空字符串、空值和無效字符串。如果遇到無效的枚舉值,它會(huì)返回null,然后在發(fā)生必填字段驗(yàn)證(魔術(shù))時(shí)捕獲該值,并RequiredAttribute在 JSON 響應(yīng)中顯示錯(cuò)誤消息。
雖然我不喜歡將類型設(shè)為可為空,但如果請(qǐng)求 JSON 中的值錯(cuò)誤AttributeType,我的 API 使用者將看到一致的驗(yàn)證消息。AttributeType

TA貢獻(xiàn)1817條經(jīng)驗(yàn) 獲得超6個(gè)贊
我認(rèn)為沒有開箱即用的數(shù)據(jù)注釋來驗(yàn)證枚舉值。
不過,您可以從 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; }
見這篇文章。

TA貢獻(xiàn)1833條經(jīng)驗(yàn) 獲得超4個(gè)贊
(請(qǐng)參閱此處的完整文章:https ://mtarleton.medium.com/enum-as-required-field-in-asp-net-core-webapi-a79b697ef270 )
這里面臨的問題是將正文轉(zhuǎn)換為 JSON 和驗(yàn)證模型驗(yàn)證的操作順序。
首先,.NET 將正文反序列化為帶有默認(rèn)值的 JSON 。這意味著如果您為不可為空的 ENUM 傳入一個(gè)空值,則會(huì)為其設(shè)置默認(rèn)值(通常是 ENUM 中的第一項(xiàng))。同樣的事情也會(huì)發(fā)生在原始人身上。
[JsonProperty(Required = Required.Always)]
- 4 回答
- 0 關(guān)注
- 285 瀏覽
添加回答
舉報(bào)