我有以下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);
}
我想同时显示所有验证消息,但它显示第一个状态,然后显示其他两个属性。
答案 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; }
}