数据验证是比较重要的,一般是前后台双向验证。前台使用js验证,而后台通过代码来验证数据。对于前台验证来说就写js来操作,而后台的验证是方式还是比较多的比如:手写正则表达式或者直接使用webform的验证组建、MVC基于Attribute声明式验证等等。这里我介绍一款轻量级基于lamda表达式的验证组建:FluentValidation。
详细流程
1、添加 FluentValidation 组建。项目上通过NuGet来获取组建,搜索名称:FluentValidation 和 FluentValidation.MVC4-Signed,需要安装2个组件
完整的项目结构:
2、创建实体类
1 |
/// <summary><br> /// 用户实体类<br> /// </summary><br> [Validator(typeof(UserinfoValidator))]<br> public class UserinfoModel<br> {<br><br> /// <summary><br> /// 主键id<br> /// </summary><br> public int Id { get; set; }<br><br> /// <summary><br> /// 用户姓名<br> /// </summary><br> public string Name { get; set; }<br><br> /// <summary><br> /// 用户年龄<br> /// </summary><br> public int Age { get; set; }<br><br> /// <summary><br> /// 邮箱地址<br> /// </summary><br> public string Email { get; set; }<br><br> /// <summary><br> /// 创建时间<br> /// </summary><br> public DateTime CreateTime { get; set; }<br><br> }<br> |
3、编写验证规则
注意:
- 添加实体类的引用
- using FluentValidation;
- 具体的验证规则是安装自己的业务逻辑需要来处理的,还有很多的验证规则,这里我就不详细罗列出来。
1 |
public class UserinfoValidator: AbstractValidator<UserinfoModel><br> {<br> public UserinfoValidator()<br> {<br> RuleFor(m => m.Name).NotEmpty().WithMessage("姓名不能为空")<br> .Length(1, 100).WithMessage("姓名长度必须在1-00位之间");//长度验证<br> RuleFor(m => m.Age).NotEmpty().WithMessage("年龄不能为空");<br> RuleFor(m => m.Email).NotEmpty().WithMessage("邮箱不能为空")<br> .EmailAddress().WithMessage("邮箱格式不正确"); //邮箱格式验证<br> RuleFor(m=>m.CreateTime).NotEmpty().WithMessage("添加时间不能为空")<br> .GreaterThanOrEqualTo(DateTime.Now.Date).WithMessage("添加时间必须大于等于当前时间");//日期验证<br> }<br><br> }<br> |
4、编写页面代码
1 |
@model FluentValidationDemo.Models.UserinfoModel<br><br> @using (Html.BeginForm())<br> {<br> <h2>添加用户</h2><br><br> <table><br> <tr><br> <td>用户姓名:</td><br> <td><br> @Html.EditorFor(m => m.Name)<br> @Html.ValidationMessageFor(m => m.Name)<br> </td><br> </tr><br> <tr><br> <td>用户年龄:</td><br> <td><br> @Html.EditorFor(m => m.Age)<br> @Html.ValidationMessageFor(m => m.Age)<br> </td><br> </tr><br> <tr><br> <td>邮箱地址:</td><br> <td><br> @Html.EditorFor(m => m.Email)<br> @Html.ValidationMessageFor(m => m.Email)<br> </td><br> </tr><br><br> <tr><br> <td>添加时间:</td><br> <td><br> @Html.EditorFor(m => m.CreateTime)<br> @Html.ValidationMessageFor(m => m.CreateTime)<br> </td><br> </tr><br> <tr><br> <td></td><br> <td><input type="submit" value="保 存" /></td><br> </tr><br> </table><br> }<br><br><script src="~/Scripts/jquery.validate.min.js"></script><br><script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script><br> |
添加下面的二个js的目的是启用前台验证,如果不加这个2个的话,点击保存按钮会提交到后台验证然后返回错误,而使用了前台验证可以减轻服务器的压力,具体的文件请在最下面的代码附件中获得。
5、编写后台代码 ,控制器代码
1 |
public ActionResult UserCreate()<br> {<br> return View();<br> }<br><br><br> /// <summary><br> /// 保存用户数据<br> /// </summary><br> /// <returns></returns><br> [HttpPost]<br> public ActionResult UserCreate(UserinfoModel model)<br> {<br> UserinfoValidator validator = new UserinfoValidator();<br> ValidationResult result = validator.Validate(model);<br><br> //获取验证结果,并将错误的数据填充到ModelStateError中<br> if (!result.IsValid)<br> {<br> result.Errors.ToList().ForEach(error =><br> {<br> ModelState.AddModelError(error.PropertyName, error.ErrorMessage);<br> });<br><br> return View();<br> }<br><br> //检查对象验证<br> if (ModelState.IsValid)<br> {<br> if (model.Name.Equals("admin"))<br> {<br> //测试添加自定义的验证错误<br> ModelState.AddModelError("Name", "姓名不能是admin");<br> return View();<br> }<br> <br> //验证成功,添加数据到数据库<br> }<br><br> return View();<br> }<br> |
6、关闭MVC自带的验证方式,使用FluentValidation 来代替
打开项目的Global.asax 文件,在Application_Start函数下面添加以下代码
1 |
// FluentValidation设置<br> DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;<br> ModelValidatorProviders.Providers.Add(new FluentValidationModelValidatorProvider(new AttributedValidatorFactory()));<br> |
注意事项:
- 注意添加引用:using FluentValidation.Attributes;using FluentValidation.Mvc;
- 如果提示错误:未能找到类型或命名空间名“FluentValidationModelValidatorProvider”, 请安装 FluentValidation.MVC4-Signed 组件,上面已经说过了。
完成以后的验证效果图
代码示例下载
百度网盘下载:代码示例 , 提取密码:gsv2
发布者:柚子,转转请注明出处:https://ityouzi.com/archives/fluent-validation-mvc-demo.html