在我的.net core 2.0 Web API中,我在我的模型属性上使用了EnumDataType()验证属性。验证失败时,自定义错误消息为空。我不确定为什么会这样 -
EnumDataType(typeof(MyEnum), ErrorMessage = "Custom Error Message")
public MyEnum MyEnumProp {get; set;}
我检查了其他属性[Required],[MinLength]并且所有属性都生成了自定义错误消息。难道我做错了什么?还有其他方法吗?
答案 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.None
是MyEnum
的有效值。这就是为什么你不会在"Custom Error Message"
错误中看到ModelState
。
现在,如果您发布以下数据:
{
"Id": 123,
"MyEnumProp": 5
}
在反序列化阶段不会发生错误,因为即使没有多大意义,后续分配也是合法的:
MyEnum v = (MyEnum)5;
因此解串器不会检测到任何错误。但是现在EnumDataType
验证开始了。并且它检测到5
不是MyEnum
的有效值。 ModelState.IsValid
设置为false
,EnumDataType.ErrorMessage
中指定的错误消息已注册("Custom Error Message"
)。
如果要为反序列化和验证错误提供相同的自定义消息,则应该达到反序列化程序(Json.NET)的级别并使用其扩展点来实现此目的。