第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

枚舉作為 ASP.NET Core WebAPI 中的必填字段

枚舉作為 ASP.NET Core WebAPI 中的必填字段

C#
慕哥6287543 2022-07-23 16:36:54
[Required]當(dāng) JSON 請(qǐng)求沒有為枚舉屬性提供正確的值時(shí),是否可以返回屬性錯(cuò)誤消息?例如,我有一個(gè) POST 消息模型,其中包含AddressType一個(gè)枚舉類型的屬性:public class AddressPostViewModel{    [JsonProperty("addressType")]    [Required(ErrorMessage = "Address type is required.")]    public AddressType AddressType { get; set; }}AddressType枚舉接受兩個(gè)值:[JsonConverter(typeof(StringEnumConverter))]public enum AddressType{    [EnumMember(Value = "Dropship")]    Dropship,    [EnumMember(Value = "Shipping")]    Shipping}我注意到(或者實(shí)際上我的 QA 團(tuán)隊(duì)注意到)如果請(qǐng)求消息 JSON 包含空字符串或 null AddressType,則錯(cuò)誤消息不是預(yù)期的Address type is required.消息。相反,錯(cuò)誤消息是一個(gè)有點(diǎn)不友好的解析錯(cuò)誤。例如,如果請(qǐng)求 JSON 如下所示:{  "addressType": "" }然后驗(yàn)證框架自動(dòng)生成的錯(cuò)誤如下所示:{    "message": "Validation Failed",    "errors": [        {            "property": "addressType",            "message": "Error converting value \"\" to type 'MyNamespace.AddressType'. Path 'addressType', line 4, position 19."        }    ]}[Required]如果有人不包含枚舉的有效值,是否有辦法確保返回屬性的錯(cuò)誤消息?
查看完整描述

4 回答

?
開心每一天1111

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

{

}


查看完整回答
反對(duì) 回復(fù) 2022-07-23
?
喵喵時(shí)光機(jī)

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


查看完整回答
反對(duì) 回復(fù) 2022-07-23
?
慕的地6264312

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; }

見這篇文章。


查看完整回答
反對(duì) 回復(fù) 2022-07-23
?
瀟瀟雨雨

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)]


查看完整回答
反對(duì) 回復(fù) 2022-07-23
  • 4 回答
  • 0 關(guān)注
  • 285 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)