我正在关注专业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()方法的属性名称,但我不确定它。任何帮助表示赞赏。
我应该在第一个地方添加DinnerFormViewModel的构造函数。 (我更新了上面的代码。)在DinnerFormViewMode类中,我确保每当它实例化时,传递一个Dinner对象或创建一个新对象。实际上,在DinnerFormViewModel(Dinner d)中,我并不检查d是否为null,但我认为我总是向它传递一个非空的Dinner对象。我仍然要添加一张支票,看看是否会发生。所以,私人二传手不应该成为问题(为了以防万一,我尝试将其公诸于众)。 – puck
那么这仍然是一个问题。模型绑定器将只使用无参数的构造函数,因此它将只能使用公开的后置数据设置属性。 –