MVC中modelstate的使用_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > MVC中modelstate的使用

MVC中modelstate的使用

 2014/11/5 16:16:51  juggd  程序员俱乐部  我要评论(0)
  • 摘要:MVC中ModelState类需要引用System.Web.Mvc命名空间,在System.Web.Mvc.dll中。属性Errors返回一个ModelErrorCollection对象,该对象包含在模型绑定期间发生的任何错误。Value返回一个ValueProviderResult对象,该对象封装在模型绑定期间绑定的值。Html辅助方法和ModelState集成HTML辅助方法,如Html.TextBox(),在输出内容时,会检查ModelState集合。如果发现该属性有异常或错误
  • 标签:MVC 使用

class="FocusMe">MVC中ModelState类需要引用 System.Web.Mvc命名空间,在 System.Web.Mvc.dll 中。

 

属性

Errors 

返回一个 ModelErrorCollection 对象,该对象包含在模型绑定期间发生的任何错误

Value

返回一个 ValueProviderResult 对象,该对象封装在模型绑定期间绑定的值。

 

Html 辅助方法和ModelState集成

 

HTML 辅助方法,如Html.TextBox(),在输出内容时,会检查ModelState集合。如果发现该属性有异常或错误,将呈现用户输入的内容和CSS错误类。   例如,在Edit视图中,我们使用Html.TextBox() 辅助方法呈现Dinner对象的EventDate属性:   <%= Html.TextBox("EventDate", String.Format("{0:g}", Model.EventDate)) %>   当有错的时候呈现视图时,Html.TextBox() 方法检查ModelState集合,检查是否有错误关联到Dinner 对象的EventDate属性。当发现有错误时,将显示用户提交的”EntLib” 输入作为参数值,同时对<input type=”textbox” />元素添加CSS 错误类,如下所示:   <input class="input-validation-error" id="EventDate" name="EventDate" type="text" value="BOGUS" />   你可以定制CSS错误类的样式。默认的CSS错误类 – input-validation-error定义在\content\site.css 文件中,样式定义如下:   .input-validation-error { border: 1px solid #ff0000;   }       Html.ValidationMessage() 辅助方法   Html.ValidationMessage() 辅助方法用来输出特定Model属性相关的ModelState错误信息:   <%= Html.ValidationMessage("EventDate") %>   上述代码输出:   <span class=”field-validation-error”> The value ‘EntLib’ is invalid</span>   Html.ValidationMessage() 辅助方法也支持第二个参数,允许开发人员覆盖错误消息:   <%= Html.ValidationMessage("EventDate", "*") %>     上述代码输出:   <span class=”field-validation-error”> *</span>,而不是默认的错误信息。       Html.ValidationSummary() 辅助方法   Html.ValidationSummary() 辅助方法将呈现总结的错误消息,通过<ul><li/></ul>元素列出在ModelState集合中所有详细的错误消息   Html.ValidationSummary() 辅助方法接收一个可选的字符串参数 – 定义一个概括性的错误消息,并显示在所有详细错误信息的前面:   <%= Html.ValidationSummary("Edit was unsuccessful. Please correct the errors and try again.") %>     你也可以定义CSS设置错误消息的样式。       使用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更改代码。这样,我们可以根据需求,以最小的更改代码量,灵活改进应用程序。
发表评论
用户名: 匿名