数据类型验证和IValidatableObject.验证方法
本文关键字:验证 方法 IValidatableObject 数据类型 | 更新日期: 2023-09-27 18:04:10
我有一个像下面这样的模型
public class MyModel : IValidatableObject
{
[DisplayName("Property Name")]
[Range(0, 9999999, ErrorMessage = "Please enter a number between 0 and 9999999")]
public int? PropName { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (this.PropName == null)
{
yield return new ValidationResult("Property Name is NOT entered");
}
}
}
在视图中,
- 当我输入一个整数值时,我没有看到错误信息"Property Name is NOT entered"
- 当我留空字段时,我看到错误消息"Property Name is NOT entered"
- 当我输入一个十进制值时,我看到下面的错误消息
- 值"xx"。
- 未输入属性名
对于案例3,我当然不希望看到Validate()方法的消息。也就是说,Validate()方法不应该在数据类型出现错误时触发。
有人能解释一下为什么会这样吗?
视图只使用@Html.ValidationSummary()来显示消息
我找不到关于字段验证、字段绑定到值以及模型绑定时Validate
执行顺序的文档。然而,我认为在Validate
执行之前,字段被绑定到它们的值。因此PropName
在Validate
中为空。
这意味着PropName
以十进制形式输入的事件顺序为:
- 错误的数据类型产生错误
- 设置为null
- 为null时产生的错误
你试过使用RequiredAttribute
代替你的自定义验证吗?这意味着你不需要实现IValidatableObject
,你的代码变成
public class MyModel
{
[Required]
[DisplayName("Property Name")]
[Range(0, 9999999, ErrorMessage = "Please enter a number between 0 and 9999999")]
public int? PropName { get; set; }
}