@Rookie
2017-07-21T10:21:15.000000Z
字数 2904
阅读 1245
公众号
程序员可以让步,却不可以退缩,可以羞涩,却不可以软弱,总之,程序员必须是勇敢的。
模型验证是在模型绑定时检查从HTTP请求接收的数据是否合规以保证数据的有效性,在收到无效数据时给出提示帮助用户纠正错误的数据。
凡是有用户输入的地方都少不了参数验证,这不光是个安全问题,也是为了保证数据完整正确。
在命令控制台输入以下命令
Install-Package System.ComponentModel.Annotations -Pre
模型验证需要在对应提交类中的需要验证格式的属性增加一些注解标记,常用的标记有:
常用标记 验证方式
Required 非空验证
StringLength 长度验证
RegularExpression 正则表达式验证
DataType 数据类型,常用于密码类型
Range 指定数字允许的范围
Range 值范围验证
Compare 对比验证
Remote 远程电泳验证
以下代码举例:
public class MoStudent
{
public int Id { get; set; }
[Required(ErrorMessage = "名称必须填写")]
[RegularExpression(@"\w{2,15}", ErrorMessage = "名称应为2-15长度的字母组合")]
public string Name { get; set; }
public bool Sex { get; set; }
public DateTime Birthday { get; set; }
}
把实体类的内容定义好,用户在访问接口时去做校验
[Route("student")]
[HttpPost]
public HttpResponseMessage AddStudent(MoStudent moStudent)
{
if (ModelState.IsValid)
{
return Request.CreateResponse(HttpStatusCode.OK, moStudent);
}
return Request.CreateResponse(HttpStatusCode.BadRequest, ModelState);
}
接口通过ModelState.IsValid来判断用户录入信息是否满足我们定义在实体类中的注解规则,不满足直接输出访问状态HttpStatusCode.BadRequest
在定义具体Action方法的时候,对已经成功绑定的参数实施手工验证无疑是一种最为直接的编程方式,首先建一个模型
public class Person
{
[DisplayName("姓名")]
public string Name { get; set; }
[DisplayName("性别")]
public string Gender { get; set; }
[DisplayName("年龄")]
public int? Age { get; set; }
}
接下来定义一个Controller。在针对GET请求的Action方法Index中,我们创建了一个Person对象并将其作为Model呈现在对应的View中。另一个支持POST请求的Index方法具有一个Person类型的参数,我们在该Action方法中先调用Validate方法对这个输入参数实施验证。如果验证成功(ModeState.IsValid属性返回True),我们返回一个内容为“输入数据通过验证”的ContentResult,否则将此参数作为Model呈现在对应的View中。
public class HomeController : Controller
{
[HttpGet]
public ActionResult Index()
{
return View(new Person());
}
[HttpPost]
public ActionResult Index(Person person)
{
Validate(person);
if (!ModelState.IsValid)
{
return View(person);
}
else
{
return Content("输入数据通过验证");
}
}
private void Validate(Person person)
{
if (string.IsNullOrEmpty(person.Name))
{
ModelState.AddModelError("Name", "'Name'是必需字段");
}
if (string.IsNullOrEmpty(person.Gender))
{
ModelState.AddModelError("Gender", "'Gender'是必需字段");
}
else if (!new string[] { "M", "F" }.Any(g => string.Compare(person.Gender, g, true) == 0))
{
ModelState.AddModelError("Gender", "有效'Gender'必须是'M','F'之一");
}
if (null == person.Age)
{
ModelState.AddModelError("Age", "'Age'是必需字段");
}
else if (person.Age > 25 || person.Age < 18)
{
ModelState.AddModelError("Age", "有效'Age'必须在18到25周岁之间");
}
}
}
如果提供的数据没有通过验证,我们会调用当前ModelState的AddModelError方法将指定的验证错误消息转换为ModelError保存起来。
如下所示的是Action方法Index对应View的定义,这是一个Model类型为Person的强类型View,它包含一个用于编辑人员信息的表单。我们直接调用HtmlHelper 的扩展方法EditorForModel将作为Model的Person对象以编辑模式呈现在表单之中。
<html>
<head>
<title>编辑人员信息</title>
</head>
<body>
@Html.ValidationSummary()
@using (Html.BeginForm())
{
<div>@Html.LabelFor(m=>m.Name)</div>
<div>@Html.EditorFor(m=>m.Name)</div>
<div>@Html.LabelFor(m=>m.Gender)</div>
<div>@Html.EditorFor(m => m.Gender)</div>
<div>@Html.LabelFor(m=>m.Age)</div>
<div>@Html.EditorFor(m => m.Age)</div>
<input type="submit" value="保存"/>
}
</body>
</html>
技术的路还很长,我们未完待续---