[关闭]
@Rookie 2017-07-21T02:21:15.000000Z 字数 2904 阅读 1143

Asp.NET -- 模型验证

公众号

作者: 刘洋

0.引言

程序员可以让步,却不可以退缩,可以羞涩,却不可以软弱,总之,程序员必须是勇敢的。

1.模型验证是什么

模型验证是在模型绑定时检查从HTTP请求接收的数据是否合规以保证数据的有效性,在收到无效数据时给出提示帮助用户纠正错误的数据。

2.我们为什么需要模型验证?

凡是有用户输入的地方都少不了参数验证,这不光是个安全问题,也是为了保证数据完整正确。

3.实现模型验证(web api & mvc 的模型验证方式)

3.0 web api 模型验证

3.01 web api 模型验证引用类库

在命令控制台输入以下命令

Install-Package System.ComponentModel.Annotations -Pre

3.02 web api 中 为Model设置DataAnnotations(数据注解)

模型验证需要在对应提交类中的需要验证格式的属性增加一些注解标记,常用的标记有:

常用标记          验证方式
Required          非空验证
StringLength      长度验证
RegularExpression 正则表达式验证
DataType          数据类型,常用于密码类型
Range             指定数字允许的范围
Range             值范围验证
Compare           对比验证
Remote            远程电泳验证

以下代码举例:

  1. public class MoStudent
  2. {
  3. public int Id { get; set; }
  4. [Required(ErrorMessage = "名称必须填写")]
  5. [RegularExpression(@"\w{2,15}", ErrorMessage = "名称应为2-15长度的字母组合")]
  6. public string Name { get; set; }
  7. public bool Sex { get; set; }
  8. public DateTime Birthday { get; set; }
  9. }

把实体类的内容定义好,用户在访问接口时去做校验

  1. [Route("student")]
  2. [HttpPost]
  3. public HttpResponseMessage AddStudent(MoStudent moStudent)
  4. {
  5. if (ModelState.IsValid)
  6. {
  7. return Request.CreateResponse(HttpStatusCode.OK, moStudent);
  8. }
  9. return Request.CreateResponse(HttpStatusCode.BadRequest, ModelState);
  10. }

接口通过ModelState.IsValid来判断用户录入信息是否满足我们定义在实体类中的注解规则,不满足直接输出访问状态HttpStatusCode.BadRequest

3.1 MVC 模型验证(手动验证)

在定义具体Action方法的时候,对已经成功绑定的参数实施手工验证无疑是一种最为直接的编程方式,首先建一个模型

  1. public class Person
  2. {
  3. [DisplayName("姓名")]
  4. public string Name { get; set; }
  5. [DisplayName("性别")]
  6. public string Gender { get; set; }
  7. [DisplayName("年龄")]
  8. public int? Age { get; set; }
  9. }

接下来定义一个Controller。在针对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. [HttpPost]
  9. public ActionResult Index(Person person)
  10. {
  11. Validate(person);
  12. if (!ModelState.IsValid)
  13. {
  14. return View(person);
  15. }
  16. else
  17. {
  18. return Content("输入数据通过验证");
  19. }
  20. }
  21. private void Validate(Person person)
  22. {
  23. if (string.IsNullOrEmpty(person.Name))
  24. {
  25. ModelState.AddModelError("Name", "'Name'是必需字段");
  26. }
  27. if (string.IsNullOrEmpty(person.Gender))
  28. {
  29. ModelState.AddModelError("Gender", "'Gender'是必需字段");
  30. }
  31. else if (!new string[] { "M", "F" }.Any(g => string.Compare(person.Gender, g, true) == 0))
  32. {
  33. ModelState.AddModelError("Gender", "有效'Gender'必须是'M','F'之一");
  34. }
  35. if (null == person.Age)
  36. {
  37. ModelState.AddModelError("Age", "'Age'是必需字段");
  38. }
  39. else if (person.Age > 25 || person.Age < 18)
  40. {
  41. ModelState.AddModelError("Age", "有效'Age'必须在18到25周岁之间");
  42. }
  43. }
  44. }

如果提供的数据没有通过验证,我们会调用当前ModelState的AddModelError方法将指定的验证错误消息转换为ModelError保存起来。

如下所示的是Action方法Index对应View的定义,这是一个Model类型为Person的强类型View,它包含一个用于编辑人员信息的表单。我们直接调用HtmlHelper 的扩展方法EditorForModel将作为Model的Person对象以编辑模式呈现在表单之中。

  1. <html>
  2. <head>
  3. <title>编辑人员信息</title>
  4. </head>
  5. <body>
  6. @Html.ValidationSummary()
  7. @using (Html.BeginForm())
  8. {
  9. <div>@Html.LabelFor(m=>m.Name)</div>
  10. <div>@Html.EditorFor(m=>m.Name)</div>
  11. <div>@Html.LabelFor(m=>m.Gender)</div>
  12. <div>@Html.EditorFor(m => m.Gender)</div>
  13. <div>@Html.LabelFor(m=>m.Age)</div>
  14. <div>@Html.EditorFor(m => m.Age)</div>
  15. <input type="submit" value="保存"/>
  16. }
  17. </body>
  18. </html>

技术的路还很长,我们未完待续---

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注