数据类型验证和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");
        }
    }
}

在视图中,

  1. 当我输入一个整数值时,我没有看到错误信息"Property Name is NOT entered"
  2. 当我留空字段时,我看到错误消息"Property Name is NOT entered"
  3. 当我输入一个十进制值时,我看到下面的错误消息
    • 值"xx"。
  4. 未输入属性名

对于案例3,我当然不希望看到Validate()方法的消息。也就是说,Validate()方法不应该在数据类型出现错误时触发。

有人能解释一下为什么会这样吗?

视图只使用@Html.ValidationSummary()来显示消息

数据类型验证和IValidatableObject.验证方法

我找不到关于字段验证、字段绑定到值以及模型绑定时Validate执行顺序的文档。然而,我认为在Validate执行之前,字段被绑定到它们的值。因此PropNameValidate中为空。

这意味着PropName以十进制形式输入的事件顺序为:

  1. 错误的数据类型产生错误
  2. 设置为null
  3. 为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; }
}