我正在关注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()方法的属性名称,但我不确定。任何帮助表示赞赏。
答案 0 :(得分:1)
首先,如果模型中有类实例属性,如果它是 null ,则不会对其任何属性运行验证。其次,您的类实例属性有一个私有的setter,因此modelbinder将无法将其实际设置为任何东西,这意味着它将始终为null。
长而短,问题是私人制定者。