避免 DTO 中的 Enum 默认值

问题描述 投票:0回答:2

我正在实现 WEB API 并拥有如下所示的 DTO。

public Class DataInput
{
        public List<DataPack> DataPacks { set; get; }
        public EleTypes EleType { get; set; }
}

这是上面 DTO 使用的枚举。

public enum EleTypes
{
        firstEle,
        SecondEle,
        thiredEle
}

所以我的AppService有以下方法。

public async Task CreateDataSet(DataInput input)
{    
       Console.WriteLine(input.EleType);
       //My operation goes here    
}

使用邮递员,我在端点之上调用,并尝试不在请求负载中包含EleType。 (就像下面的有效负载一样,只有 DataPacks 元素。)

{
     "DataPacks": [ <my data going here> ] 
}

当调用此函数时,API 成功命中,但即使我没有在邮递员请求负载中为 EleType 设置任何值,它也会为 EleType 带来“firstEle”。

我想避免这种情况。如果 EleType 没有任何值,则需要对其进行验证。只是该方法的运行应该停止。有哪位专家可以指导我如何验证这种情况吗?

c# enums asp.net-core-webapi dto
2个回答
1
投票

枚举有两个问题:

  1. 序列化程序将它们视为值类型,因此如果您不提供值,将使用默认值。这可以通过

    required
    关键字来处理:

    public class Dto
    {
       public required EleTypes Type { get; set; }
    }
    

    (或者通过使属性可为空并用必需属性标记它 - 参见这个答案

  2. 您可以传递任何有效的整数(默认情况下枚举的基础类型是整数),binder 将验证它是否正确。为此,我建议切换到

    FluentValidation
    并内置枚举验证器


0
投票

我修改了如下代码,问题就解决了。

public Class DataInput
{
        public List<DataPack> DataPacks { set; get; }
        [Required]
        public EleTypes? EleType { get; set; }
}
© www.soinside.com 2019 - 2024. All rights reserved.