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

arp*_*tro 5 enums data-annotations asp.net-core asp.net-core-2.0

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

EnumDataType(typeof(MyEnum), ErrorMessage = "Custom Error Message")
public MyEnum MyEnumProp {get; set;}
Run Code Online (Sandbox Code Playgroud)

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

Cod*_*ler 7

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

说您有以下内容enum

public enum MyEnum
{
    None,
    Value1,
    Value2
}
Run Code Online (Sandbox Code Playgroud)

和以下模型:

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

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

发布数据时:

{
  "Id": 123,
  "MyEnumProp": "UnexistingEnumValue"
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

{
  "Id": 123,
  "MyEnumProp": 5
}
Run Code Online (Sandbox Code Playgroud)

在反序列化阶段不会发生任何错误,因为即使没有太大意义,以下分配也是合法的:

MyEnum v = (MyEnum)5;
Run Code Online (Sandbox Code Playgroud)

因此解串器将不会检测到任何错误。但是现在EnumDataType验证开始起作用了。并且它检测到的5值无效MyEnumModelState.IsValid设置为,falseEnumDataType.ErrorMessage注册中指定的错误信息("Custom Error Message")。

如果您希望针对反序列化和验证错误使用相同的自定义消息,则应提高反序列化器(Json.NET)的级别,并为此目的使用其可扩展性点。