<%= Html.ValidationMessage("EventDate") %>
Html.ValidationSummary() 辅助方法
Html.ValidationSummary() 辅助方法将呈现总结的错误消息,通过<ul><li/></ul>元素列出在ModelState集合中所有详细的错误消息
Html.ValidationSummary() 辅助方法接收一个可选的字符串参数 – 定义一个概括性的错误消息,并显示在所有详细错误信息的前面:
<%= Html.ValidationSummary("Edit
was unsuccessful. Please correct the errors and try again.") %>
Html.ValidationMessage() 辅助方法也支持第二个参数,允许开发人员覆盖错误消息:
<%= Html.ValidationMessage("EventDate",
"*") %>
ModelState.AddModelError(issue.PropertyName,
issue.ErrorMessage);
使用AddRuleViolations辅助方法
初始的HTTP-POST Edit的实现方法使用了一个foreach循环语句,遍历Dinner对象的Rule Violations,并添加到controller的ModelState集合:
catch
{
foreach (var issue in dinner.GetRuleViolations())
{
ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
}
return View(dinner);
}
为了使代码更简洁一点,我们添加ControllerHelpers类到NerdDinner项目中,并实现了AddRuleViolations扩展方法,添加了一个对ASP.NET MVC ModelStateDictionary 类的辅助方法。该扩展方法封装了使用RuleViolation 错误信息填充ModelStateDictionary 集合类的逻辑:
public static class ControllerHelpers
{
public static void AddRuleViolations(this ModelStateDictionary modelState,
IEnumerable<RuleViolation> errors)
{
foreach (RuleViolation issue in errors)
{
modelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
}
}
}
接下来,我们更新HTTP-POST Edit方法,使用上述扩展方法实现Dinner的Rule Violations填充ModelState集合。
完成Edit Action方法的实现
下面的代码实现了控制器中Edit的所有逻辑:
C# 代码 复制
//
// GET: /Dinners/Edit/2
public ActionResult Edit(int id)
{
Dinner dinner = dinnerRepository.GetDinner(id);
return View(dinner);
}
//
// POST: /Dinners/Edit/2
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, FormCollection formValues)
{
Dinner dinner = dinnerRepository.GetDinner(id);
try
{
UpdateModel(dinner);
dinnerRepository.Save();
return RedirectToAction("Details", new { id = dinner.DinnerID });
}
catch
{
ModelState.AddRuleViolations(dinner.GetRuleViolations());
return View(dinner);
}
}

关于Edit方法的实现的优点,不仅Controller类,而且View视图模板都不必关心Dinner模型类的特定验证方法或者业务规则。以后,我们可以针对Model类增加额外的业务规则,而不必要求Controller和View更改代码。这样,我们可以根据需求,以最小的更改代码量,灵活改进应用程序。