在提交中的数据注释模型中验证多个字段(Datetime和Bool)

时间:2015-09-02 08:19:50

标签: c# asp.net-mvc asp.net-mvc-3 validation data-annotations

目前我正在研究MVC 3环境,我需要添加验证,验证Dataannotation模型中的2个字段,就像在提交时触发的[Required(ErrorMessage="Required!")]验证一样。

目前,验证[Required]正在运行,但我需要检查booldateTime数据类型

继承我的模型中的代码

public class NameInfo: IValidatableObject
    {

        [Display(Name = "Name")]
        [Required(ErrorMessage = "Required!")]
        public string Name{ get; set; }

        [Display(Name = "Start Date")]
        [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
        public Nullable<DateTime> StartDate { get; set; }

        [Display(Name = "Already Starting")]
        public bool IsStarting{ get; set; }


        public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
        {
            if (!IsStarting&& !StartDate.HasValue)
            {
                yield return new ValidationResult("Required.", new[] { "StartDate" });

            }  
        }
    }

目前即时使用IValidatableObject,但未验证,除非name字段模型状态已经有效

提前致谢!

1 个答案:

答案 0 :(得分:1)

  

目前我正在使用IValidatableObject,但它没有验证,除非   名称字段模型状态已经有效

DataAnnotationsIValidatableObject不会一起验证。我的意思是IValidatableObject的验证方法仅在您的DataAnnotations有效时才会被调用。

编写自己的ValdiationAttribute或将所需的验证添加到IValidatableObject

以下是后者的一个例子......

public class NameInfo : IValidatableObject
{

    [Display(Name = "Name")]
    public string Name { get; set; }

    [Display(Name = "Start Date")]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
    public Nullable<DateTime> StartDate { get; set; }

    [Display(Name = "Already Starting")]
    public bool IsStarting { get; set; }


    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {

        if (string.IsNullOrEmpty(Name))
        {
            yield return new ValidationResult("Name is required!");
        }


        if (!IsStarting && !StartDate.HasValue)
        {
            yield return new ValidationResult("Required.", new[] { "StartDate" });

        }

    }
}