ViewData有一个ModelState的属性,这是一个类型为ModelStateDictionary的ModelState类型的字典集合。在进行数据验证的时候这个属性是比较有用的。在使用Html.ValidationMessage()的时候,就是从ViewData.ModelState中检测是否有指定的KEY,如果存在,就提示错误信息。
ModelState的内容何时被修改:
模型绑定时; 每一个值在模型状态中都有相应的一条记录。可以随时查看绑定状态
MVC控制器中语句赋值,例如 ModelState.AddModelError("Password","密码错误");
ModelState的属性
Errors :返回一个 ModelErrorCollection 对象,该对象包含在模型绑定期间发生的所以错误【绑定后验证,所以错误】
Value:返回一个 ValueProviderResult 对象,该对象封装在模型绑定期间绑定的值。例如模型错误,重新回到输入界面时原来输入的值会显示
错误有模型级和属性级:
ModelState.IsValid
ModelState.IsValidField("Name")
Html 辅助方法和ModelState集成
HTML 辅助方法,如Html.TextBox(),在输出内容时,会检查ModelState集合。如果发现该属性有异常或错误,将呈现用户输入的内容和CSS错误类。
<%= Html.TextBox("EventDate", String.Format("{0:g}", Model.EventDate)) %>
.input-validation-error
{
border: 1px solid #ff0000;
}
Html.ValidationMessage() 辅助方法
<%= Html.ValidationMessage("EventDate", "*") %>
Html.ValidationSummary() 辅助方法
使用AddRuleViolations辅助方法
catch
{
foreach (var issue in dinner.GetRuleViolations())
{
ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
}
return View(dinner);
}
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);
}
}
}
完成Edit Action方法的实现

//
// 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更改代码。这样,我们可以根据需求,以最小的更改代码量,灵活改进应用程序。
Errors :返回一个 ModelErrorCollection 对象,该对象包含在模型绑定期间发生的所以错误【绑定后验证,所以错误】
Value:返回一个 ValueProviderResult 对象,该对象封装在模型绑定期间绑定的值。例如模型错误,重新回到输入界面时原来输入的值会显示
错误有模型级和属性级:
ModelState.IsValid
ModelState.IsValidField("Name")
Html 辅助方法和ModelState集成
HTML 辅助方法,如Html.TextBox(),在输出内容时,会检查ModelState集合。如果发现该属性有异常或错误,将呈现用户输入的内容和CSS错误类。
<%= Html.TextBox("EventDate", String.Format("{0:g}", Model.EventDate)) %>
.input-validation-error
{
border: 1px solid #ff0000;
}
Html.ValidationMessage() 辅助方法
<%= Html.ValidationMessage("EventDate", "*") %>
Html.ValidationSummary() 辅助方法
使用AddRuleViolations辅助方法
catch
{
foreach (var issue in dinner.GetRuleViolations())
{
ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
}
return View(dinner);
}
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);
}
}
}
完成Edit Action方法的实现

//
// 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更改代码。这样,我们可以根据需求,以最小的更改代码量,灵活改进应用程序。