模型验证不适用于所有属性

时间:2014-12-30 20:08:39

标签: asp.net-mvc asp.net-mvc-5 data-annotations

我有以下ViewModel:

 public class MyViewModel:IValidatableObject
    {
        public int Id { get; set; }

        public string Name { get; set; }

        public DateTime? Birthday { get; set; }

        public int Status { get; set; }

        public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
        {
            if (string.IsNullOrWhiteSpace(Name))
                yield return new ValidationResult("Please fill the name", new string[] { "Name" });

            if (Birthday.HasValue == false)
                yield return new ValidationResult("Please fill the birthday", new string[] { "Birthday" });

            if(Status <= 0)
                yield return new ValidationResult("Please fill the status", new string[] { "Status" });
        }
    }

控制器:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "Id,Name,Birthday,Status")] MyViewModel myViewModel)
{
    if (ModelState.IsValid)
    {
        db.MyViewModels.Add(myViewModel);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(myViewModel);
}

我想同时显示所有验证消息,但它显示第一个状态,然后显示其他两个属性。

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:1)

这是由于验证发生的顺序。首先,ModelBinder完成它的工作,如果通过,由于您通过实现IValidatableObject创建了自我验证视图模型,因此调用Validate方法。在第一个屏幕截图中,模型绑定过程失败,因此永远不会调用Validate。在第二个屏幕截图中,modelbinding成功,但Validate()失败。

您可以使用DataAnnotations而不是实现IValidatableObject来解决此问题:

    public class MyViewModel:IValidatableObject
    {
        public int Id { get; set; }
        [Required]
        public string Name { get; set; }
        [Required]
        public DateTime Birthday { get; set; }
        [Required, Range(0, Int32.MaxValue)]
        public int Status { get; set; }
    }