最近有项目需要使用.net的web,啥也不说,直接开始学习.net的mvc框架。感觉微软的web项目其实还是很好用的,今天和大家分享一下服务端验证的事情。其实原理就是用到了c#的特性,特性不用多说,大家都应该很清楚,也是一个类,标记了特性的类或者方法,就可以是用特性类的数据,并且打上了一个特殊的标记,以方便我们进行区分从而进行调用。
话不多说,直接开始!
第一步:自定义特性类
public class CustomAttribute : ValidationAttribute { public Int32 age { get; set; } public CustomAttribute(int age) { this.age = age; } //这里的value参数来源于字段值 public override bool IsValid(object value) { if ((Int32)value < this.age) return false; else return true; } //这里的name参数来源于ErrorMessage public override string FormatErrorMessage(string name) { return name+"必须大于20"; } }
继承于ValidationAttribute,并且主要是重写IsValid和FormatErrorMessage。
第二步:定义model,并且添加特性
public class People { [Display(Name = "姓名")] public string name{get;set;} [Display(Name = "年龄")] [Custom(30,ErrorMessage ="年龄")] public int? age { get; set; } }
第三步:前端代码,前端借用了HTML的封装方法快速生成字段,注意这里需要在css中设置field-validation-error的颜色,否则提示不明显
@using MiniWeb.Models @model People @{ ViewBag.Title = "addPeople"; } <style type="text/css"> .field-validation-error { color:red; } </style> <div class="container"> <h2>addPeople</h2> <form action="doAdd" method="post"> @using (Html.BeginForm()) { @Html.EditorForModel() <input type="submit" value="提交" /> } </form> </div>
第四步:action的代码,通过内置属性ModelState.IsValid来判断是否通过验证
public ActionResult doAdd(People p)
{
if (!ModelState.IsValid)
{
return View("addPeople");
}
return Content("成功");
}
至此完毕!总结一下整个过程,当前端调用action的时候,后台默认都会检查model对象是否定义了特性验证,正是因为这个原因才会最终进入验证判断。验证的详细结果在前台我们通过@HTML.ValidationMessageFor可以获取。本实例中@Html.EditorForModel()已经把ValidationMessageFor封装进去了。通过本例我们可以看到,微软封装的强大和服务端验证的实际后台逻辑到底是如何实现的!