可以为空的数据类型验证和IValidatableObject.Validate方法

时间:2014-05-20 15:16:54

标签: c# asp.net-mvc validation asp.net-mvc-4 razor

我有一个类似下面的模型

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. 当我输入一个整数值时,我没有看到错误信息&#34;未输入属性名称&#34;
  2. 当我将该字段留空时,我看到错误消息&#34;未输入属性名称&#34;
  3. 当我输入小数值时,我会看到下面的错误消息
    • 价值&#39; xx.xx&#39;对于物业名称无效。
    • 未输入属性名称
  4. 对于案例3,我当然不希望看到来自Validate()方法的消息。即当数据类型出错时,应该从未触发过Validate()方法。

    有人可以解释为什么会这样吗?

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

1 个答案:

答案 0 :(得分:0)

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

这表示以小数形式输入时PropName的事件顺序为:

  1. 错误数据类型生成错误
  2. 设为null
  3. 因null而生成错误
  4. 您是否尝试过使用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; }
    }