小编Cam*_*per的帖子

使用TryUpdateModel绑定时,MVC ValidationSummary忽略模型级验证错误

这是一个与已发布的问题非常相似的问题:ASP.NET MVC:在TryUpdateModel中设置的验证消息未显示ValidationSummary

我不确定那个旧主题是否参考了早期版本的MVC,但在MVC3中,我遇到了类似行的奇怪行为.

我有一个名为Trade的模型类.它继承自IValidatableObject,因此实现了Validate方法.在此范围内,我们对模型进行了整体验证(与强制验证属性的数据注释相对).验证如下:

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
  {
     var validationResults = new List<ValidationResult>();

     if (this.EndDate < this.StartDate)
     {
        validationResults.Add(new ValidationResult("End date must be greater than start date"));
     }

     return validationResults;
  }
Run Code Online (Sandbox Code Playgroud)

我们有一个视图模型来帮助显示交易.这包含通过TradeModel属性对交易模型的引用.所以基本上,视图模型是一个交易模型,加上一些额外的信息,用于下拉列表的比例,例如交易对手等.

我们的CSHTML类包含一个ValidationSummary,其中"true"作为参数,这意味着它只显示模型错误.

如果我实现我的HttpPost控制器方法来创建一个新的贸易如下...

  [HttpPost]
  public ActionResult Create(FormCollection collection)
  {
     var trade = new Trade();

     if (this.TryUpdateModel(trade))
     {
        if (this.SaveChanges(this.ModelState, trade))
        {
           return this.RedirectToAction("Index");
        }
     }

     return this.View(trade);
  }
Run Code Online (Sandbox Code Playgroud)

...当我使用StartDate> EndDate进行交易时,我发现TryUpdateModel返回false并且用户被定向回他们的交易.这看似合乎逻辑.不幸的是ValidationSummary没有显示任何错误消息.

如果我在Create方法中放置一个断点并调查ModelState,我可以看到字典中有一条错误消息.它违反了"TradeModel"的密钥,而不是针对任何属性.再次,这似乎合乎逻辑.

关于其原因的一个理论是ValidationSummary假定针对非String.Empty的键的任何验证错误必须是属性验证错误,它忽略了我们的验证错误,因为我们有一个包含对模型的引用的视图模型,因此导致Key成为"TradeModel".

这个理论脱离水的原因是:如果我重写控制器的Create函数如下......

  [HttpPost]
  public ActionResult Create(Trade trade, FormCollection collection)
  {
     if (this.SaveChanges(this.ModelState, trade))
     {
        return this.RedirectToAction("Index"); …
Run Code Online (Sandbox Code Playgroud)

c# asp.net validationsummary asp.net-mvc-3

6
推荐指数
1
解决办法
3350
查看次数

标签 统计

asp.net ×1

asp.net-mvc-3 ×1

c# ×1

validationsummary ×1