一、手工验证绑定的参数
二、使用ValidationAttribute特性 三、让数据类型实现IValidatableObject接口 四、让数据类型实现IDataErrorInfo接口http://www.cnblogs.com/yeagen/archive/2012/09/24/2700836.html
一、手工验证绑定的参数在定义具体Action方法的时候,对已经成功绑定的参数实施手工验证无疑是一种最为直接的编程方式,接下来我们通过一个简单的实例来演示如何将参数验证逻辑实现在对应的Action方法中,并在没有通过验证的情况下将错误信息响应给客户端。我们在一个ASP.NET MVC应用中定义了如下一个Person类作为被验证的数据类型,它的Name、Gender和Age三个属性分别表示一个人的姓名、性别和年龄。
1: public class Person
2: { 3: [DisplayName("姓名")] 4: public string Name { get; set; } 5: 6: [DisplayName("性别")] 7: public string Gender { get; set; } 8: 9: [DisplayName("年龄")] 10: public int? Age { get; set; } //int?:表示可空类型,就是一种特殊的值类型,它的值可以为null 注意不是0是null 11: } 接下来我们定义了如下一个HomeController。在针对GET请求的Action方法Index中,我们创建了一个Person对象并将其作为Model呈现在对应的View中。另一个支持POST请求的Index方法具有一个Person类型的参数,我们在该Action方法中先调用Validate方法对这个输入参数实施验证。如果验证成功(ModeState.IsValid属性返回True),我们返回一个内容为“输入数据通过验证”的ContentResult,否则将此参数作为Model呈现在对应的View中。1: public class HomeController : Controller
2: { 3: [HttpGet] 4: public ActionResult Index() 5: { 6: return View(new Person()); 7: } 8: 9: [HttpPost] 10: public ActionResult Index(Person person) 11: { 12: Validate(person); 13: 14: if (!ModelState.IsValid) 15: { 16: return View(person); 17: } 18: else 19: { 20: return Content("输入数据通过验证"); 21: } 22: } 23: 24: private void Validate(Person person) 25: { 26: if (string.IsNullOrEmpty(person.Name)) 27: { 28: ModelState.AddModelError("Name", "'Name'是必需字段"); 29: } 30: 31: if (string.IsNullOrEmpty(person.Gender)) 32: { 33: ModelState.AddModelError("Gender", "'Gender'是必需字段"); 34: } 35: else if (!new string[] { "M", "F" }.Any(g => string.Compare(person.Gender, g, true) == 0)) 36: { 37: ModelState.AddModelError("Gender", "有效'Gender'必须是'M','F'之一"); 38: } 39: 40: if (null == person.Age) 41: { 42: ModelState.AddModelError("Age", "'Age'是必需字段"); 43: } 44: else if (person.Age > 25 || person.Age < 18) 45: { 46: ModelState.AddModelError("Age", "有效'Age'必须在18到25周岁之间"); 47: } 48: } 49: }
如下所示的是Action方法Index对应View的定义,这是一个Model类型为Person的强类型View,它包含一个用于编辑人员信息的表单。
我们直接调用HtmlHelper<TModel> 的扩展方法EditorForModel将作为Model的Person对象以编辑模式呈现在表单之中。1: @model Person
2: <html> 3: <head> 4: <title>编辑人员信息</title> 5: </head> 6: <body> 7: @Html.ValidationSummary() 8: @using (Html.BeginForm()) 9: { 10: <div>@Html.LabelFor(m=>m.Name)</div> 11: <div>@Html.EditorFor(m=>m.Name)</div> 12: 13: <div>@Html.LabelFor(m=>m.Gender)</div> 14: <div>@Html.EditorFor(m => m.Gender)</div> 15: 16: <div>@Html.LabelFor(m=>m.Age)</div> 17: <div>@Html.EditorFor(m => m.Age)</div> 18: 19: <input type="submit" value="保存"/> 20: } 21: </body> 22: </html>