2017-03-07 56 views
1

我正在关注专业ASP.NET MVC 1.0(我使用VisualStudio 2015附带的ASP.NET MVC版本)上的NerdDinner示例,到目前为止我能解决一些小问题,但是这个问题让我感到困惑。更改后不显示ModelState错误模型

我有一个名为Dinner的模型,它被传递给一个称为Create()的动作的视图。与Create对应的视图基本上是一个表单,用于询问某些信息,并在提交时显示错误(如果有)。错误通过ModelState对象传递给视图。

public ActionResult Create() 
    { 
     Dinner dinner = new Dinner(); 
     return View(dinner); 
    } 

    [HttpPost] 
    public ActionResult Create(Dinner d) 
    { 
     TryUpdateModel(d); 
     if (d.isValid) 
     { 
      ... 
     } 
     else 
     { 
      foreach (var violation in d.GetRuleViolations()) 
       ModelState.AddModelError(violation.PropertyName, violation.ErrorMessage); 
      return View(d); 
     } 
    } 

创建视图看起来像这样。

@model NerdDinner.Models.Dinner 

... 

      @Html.ValidationMessageFor(Model => Model.Title, "", new { @class = "text-danger" }) 

... 

这工作得很好,直到我创建了一个名为DinnerFormViewModel的新模型,以将其他对象传递给创建视图。

public class DinnerFormViewModel 
{ 
    public Dinner Dinner 
    { 
     get; 
     private set; 
    } 

    public DinnerFormViewModel() : this(new Dinner()) { } 

    public DinnerFormViewModel(Dinner d) 
    { 
     Dinner = d; 
    } 

    ... stuff ... 
} 

我更新了Create()方法,以确保将正确的模型传递给相应的视图。

public ActionResult Create() 
    { 
     Dinner dinner = new Dinner(); 
     return View(new DinnerFormViewModel(dinner)); // Updated line. 
    } 

    [HttpPost] 
    public ActionResult Create(DinnerFormViewModel d) // Updated line. 
    { 
     TryUpdateModel(d); 
     if (d.Dinner.isValid) // Updated line. 
     { 
      ... 
     } 
     else 
     { 
      foreach (var violation in d.Dinner.GetRuleViolations()) // Updated line. 
       ModelState.AddModelError(violation.PropertyName, violation.ErrorMessage); 
      return View(new DinnerFormViewModel(d.Dinner)); // Updated line. 
     } 
    } 

还更新了视图。

@model NerdDinner.Models.DinnerFormViewModel 

... 

      @Html.ValidationMessageFor(Model => Model.Dinner.Title, "", new { @class = "text-danger" }) 

... 

,因为它应该(有效的表单数据正确保存)页面功能,但是当无效信息提交错误不会在页面上不再显示。在视图文件中,我检查了存储在ModelState中的错误,它们都在那里。 ModelState和表单域之间似乎有一个断开。我在想这个问题是我提供给ModelState.AddModelError()方法的属性名称,但我不确定它。任何帮助表示赞赏。

回答

1

首先,当您的模型中有类实例属性时,如果它是null,则验证不会在其任何属性上运行。其次,你的类实例属性有一个私有的setter,所以modelbinder将无法真正将它设置为任何东西,这意味着它始终为空。

总而言之,问题在于私人二传手。

+0

我应该在第一个地方添加DinnerFormViewModel的构造函数。 (我更新了上面的代码。)在DinnerFormViewMode类中,我确保每当它实例化时,传递一个Dinner对象或创建一个新对象。实际上,在DinnerFormViewModel(Dinner d)中,我并不检查d是否为null,但我认为我总是向它传递一个非空的Dinner对象。我仍然要添加一张支票,看看是否会发生。所以,私人二传手不应该成为问题(为了以防万一,我尝试将其公诸于众)。 – puck

+0

那么这仍然是一个问题。模型绑定器将只使用无参数的构造函数,因此它将只能使用公开的后置数据设置属性。 –