不显示EnumDataType()属性验证错误消息

时间:2018-04-06 11:22:14

标签: asp.net-core enums data-annotations asp.net-core-2.0

在我的.net core 2.0 Web API中,我在我的模型属性上使用了EnumDataType()验证属性。验证失败时,自定义错误消息为空。我不确定为什么会这样 -

EnumDataType(typeof(MyEnum), ErrorMessage = "Custom Error Message")
public MyEnum MyEnumProp {get; set;}

我检查了其他属性[Required],[MinLength]并且所有属性都生成了自定义错误消息。难道我做错了什么?还有其他方法吗?

1 个答案:

答案 0 :(得分:5)

在反序列化和验证阶段检测到的错误之间经常出现混淆。

假设您有以下enum

public enum MyEnum
{
    None,
    Value1,
    Value2
}

和以下型号:

public class TestModel
{
    [Required]
    public int? Id { get; set; }

    [EnumDataType(typeof(MyEnum), ErrorMessage = "Custom Error Message")]
    public MyEnum MyEnumProp { get; set; }
}

发布数据时:

{
  "Id": 123,
  "MyEnumProp": "UnexistingEnumValue"
}

错误将在反序列化阶段发生(在Json.NET中针对此情况)。反序列化器无法将字符串"UnexistingEnumValue"转换为MyEnum中的某些值。 在这种情况下,反序列化器将注册以下模型绑定错误:Requested value 'UnexistingEnumValue' was not found

ModelState.IsValid将设置为false,但MyEnumProp的值将保留为默认值MyEnum.None。由EnumDataType属性执行的验证不会检测到任何错误,因为MyEnum.NoneMyEnum的有效值。这就是为什么你不会在"Custom Error Message"错误中看到ModelState

现在,如果您发布以下数据:

{
  "Id": 123,
  "MyEnumProp": 5
}

在反序列化阶段不会发生错误,因为即使没有多大意义,后续分配也是合法的:

MyEnum v = (MyEnum)5;

因此解串器不会检测到任何错误。但是现在EnumDataType验证开始了。并且它检测到5不是MyEnum的有效值。 ModelState.IsValid设置为falseEnumDataType.ErrorMessage中指定的错误消息已注册("Custom Error Message")。

如果要为反序列化和验证错误提供相同的自定义消息,则应该达到反序列化程序(Json.NET)的级别并使用其扩展点来实现此目的。