我正在关注 Professional ASP.NET MVC 1.0 上的 NerdDinner 示例(我正在使用 VisualStudio 2015 附带的 ASP.NET MVC 版本),到目前为止,我能够解决一些小问题,但这一个让我.
我有一个名为 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 的新模型来将其他对象传递给 Create 视图。
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() 方法的属性名称,但我不确定。任何帮助表示赞赏。