我正在实现 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 没有任何值,则需要对其进行验证。只是该方法的运行应该停止。有哪位专家可以指导我如何验证这种情况吗?
枚举有两个问题:
序列化程序将它们视为值类型,因此如果您不提供值,将使用默认值。这可以通过
required
关键字来处理:
public class Dto
{
public required EleTypes Type { get; set; }
}
(或者通过使属性可为空并用必需属性标记它 - 参见这个答案)
您可以传递任何有效的整数(默认情况下枚举的基础类型是整数),binder 将验证它是否正确。为此,我建议切换到
FluentValidation
并内置枚举验证器
我修改了如下代码,问题就解决了。
public Class DataInput
{
public List<DataPack> DataPacks { set; get; }
[Required]
public EleTypes? EleType { get; set; }
}