忽略EnumDataType数据注释属性中的空值

时间:2018-04-20 16:20:06

标签: c# api asp.net-web-api data-annotations

我有一个可以为空的枚举和API层的模型。在API层中,我获取模型并检查其状态。当我在此枚举中发送空值时,我从模型状态获得一条错误消息,因为枚举不能为空。是否可以更改属性以使其忽略并且在空的情况下不添加错误消息?

这是我的代码:

public class MyModel
{
    [EnumDataType(typeof(MyEnum?))]
    public MyEnum? MyEnum { get; set; }
}

这就是API层:

[HttpPost]
[Route("")]
public async Task<int> Post(MyModel myModel)
{
    Validate(myModel);

    if (!ModelState.IsValid)
    {
        //Stop the process and return a message...
    }

    //Continue with the process.
    //Call the BL, etc.
}

1 个答案:

答案 0 :(得分:1)

首先,您应该将传递给EnumDataType属性的类型从MyEnum?更改为MyEnumEnumDataType预计enum类型,但MyEnum?实际为Nullable<MyEnum>,这将导致InvalidOperationException

然后在请求正文中发布的JSON应该正确地反序列化到模型:

{
  "MyEnum": null
}

通过JSON.NET反序列化后,MyModel.MyEnum属性将设置为nullEnumDataType不会对null值执行任何验证,您将获得有效的模型。

  

当我在此枚举中发送空值时,我收到来自的错误消息   模型状态因为枚举不能为空。

最可能的原因是您将null值作为字符串发送:

{
  "MyEnum": "null"
}

这样的JSON会导致反序列化错误(在JSON.NET中),因为反序列化器不知道如何将字符串"null"转换为MyEnum。这不是验证属性产生的错误,因为只有在deserilization成功完成时才会执行任何验证。检查this answer以获取有关模型反序列化和验证阶段的更多详细信息。