FluentValidation 验证组建在MVC中的运用(图文,附代码示例)

 数据验证是比较重要的,一般是前后台双向验证。前台使用js验证,而后台通过代码来验证数据。对于前台验证来说就写js来操作,而后台的验证是方式还是比较多的比如:手写正则表达式或者直接使用webform的验证组建、MVC基于Attribute声明式验证等等。这里我介绍一款轻量级基于lamda表达式的验证组建:FluentValidation。

详细流程

1、添加 FluentValidation 组建。项目上通过NuGet来获取组建,搜索名称:FluentValidation 和 FluentValidation.MVC4-Signed,需要安装2个组件

FluentValidation 验证组建在MVC中的运用(图文,附代码示例)

完整的项目结构:

FluentValidation 验证组建在MVC中的运用(图文,附代码示例)

2、创建实体类

    /// <summary>
    /// 用户实体类
    /// </summary>
    [Validator(typeof(UserinfoValidator))]
    public class UserinfoModel
    {

        /// <summary>
        /// 主键id
        /// </summary>
        public int Id { get; set; }

        /// <summary>
        /// 用户姓名
        /// </summary>
        public string Name { get; set; }

        /// <summary>
        /// 用户年龄
        /// </summary>
        public int Age { get; set; }

        /// <summary>
        /// 邮箱地址
        /// </summary>
        public string Email { get; set; }

        /// <summary>
        /// 创建时间
        /// </summary>
        public DateTime CreateTime { get; set; }

    }

3、编写验证规则

注意:

  • 添加实体类的引用
  • using FluentValidation;
  • 具体的验证规则是安装自己的业务逻辑需要来处理的,还有很多的验证规则,这里我就不详细罗列出来。
   public class UserinfoValidator: AbstractValidator<UserinfoModel>
    {
        public UserinfoValidator()
        {
            RuleFor(m => m.Name).NotEmpty().WithMessage("姓名不能为空")
                .Length(1, 100).WithMessage("姓名长度必须在1-00位之间");//长度验证
            RuleFor(m => m.Age).NotEmpty().WithMessage("年龄不能为空");
            RuleFor(m => m.Email).NotEmpty().WithMessage("邮箱不能为空")
                .EmailAddress().WithMessage("邮箱格式不正确"); //邮箱格式验证
            RuleFor(m=>m.CreateTime).NotEmpty().WithMessage("添加时间不能为空")
                .GreaterThanOrEqualTo(DateTime.Now.Date).WithMessage("添加时间必须大于等于当前时间");//日期验证
        }

    }

4、编写页面代码

@model FluentValidationDemo.Models.UserinfoModel

    @using (Html.BeginForm())
    {
        <h2>添加用户</h2>

        <table>
            <tr>
                <td>用户姓名:</td>
                <td>
                    @Html.EditorFor(m => m.Name)
                    @Html.ValidationMessageFor(m => m.Name)
                </td>
            </tr>
            <tr>
                <td>用户年龄:</td>
                <td>
                    @Html.EditorFor(m => m.Age)
                    @Html.ValidationMessageFor(m => m.Age)
                </td>
            </tr>
            <tr>
                <td>邮箱地址:</td>
                <td>
                    @Html.EditorFor(m => m.Email)
                    @Html.ValidationMessageFor(m => m.Email)
                </td>
            </tr>

            <tr>
                <td>添加时间:</td>
                <td>
                    @Html.EditorFor(m => m.CreateTime)
                    @Html.ValidationMessageFor(m => m.CreateTime)
                </td>
            </tr>
            <tr>
                <td></td>
                <td><input type="submit" value="保 存" /></td>
            </tr>
        </table>
    }

<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>

添加下面的二个js的目的是启用前台验证,如果不加这个2个的话,点击保存按钮会提交到后台验证然后返回错误,而使用了前台验证可以减轻服务器的压力,具体的文件请在最下面的代码附件中获得。

5、编写后台代码 ,控制器代码

     public ActionResult UserCreate()
        {
            return View();
        }


        /// <summary>
        /// 保存用户数据
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public ActionResult UserCreate(UserinfoModel model)
        {
            UserinfoValidator validator = new UserinfoValidator();
            ValidationResult result = validator.Validate(model);

            //获取验证结果,并将错误的数据填充到ModelStateError中
            if (!result.IsValid)
            {
                result.Errors.ToList().ForEach(error =>
                {
                    ModelState.AddModelError(error.PropertyName, error.ErrorMessage);
                });

                return View();
            }

            //检查对象验证
            if (ModelState.IsValid)
            {
                if (model.Name.Equals("admin"))
                {
                    //测试添加自定义的验证错误
                    ModelState.AddModelError("Name", "姓名不能是admin");
                    return View();
                }
                    
                //验证成功,添加数据到数据库
            }

            return View();
        }

6、关闭MVC自带的验证方式,使用FluentValidation 来代替

打开项目的Global.asax 文件,在Application_Start函数下面添加以下代码

  // FluentValidation设置
  DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
  ModelValidatorProviders.Providers.Add(new FluentValidationModelValidatorProvider(new AttributedValidatorFactory()));

注意事项:

  • 注意添加引用:using FluentValidation.Attributes;using FluentValidation.Mvc;
  • 如果提示错误:未能找到类型或命名空间名“FluentValidationModelValidatorProvider”, 请安装 FluentValidation.MVC4-Signed 组件,上面已经说过了。

完成以后的验证效果图

FluentValidation 验证组建在MVC中的运用(图文,附代码示例)
FluentValidation 验证组建在MVC中的运用(图文,附代码示例)
FluentValidation 验证组建在MVC中的运用(图文,附代码示例)

代码示例下载

百度网盘下载:代码示例   , 提取密码:gsv2

发布者:IT柚子,转转请注明出处:https://ityouzi.com/archives/fluent-validation-mvc-demo.html

(1)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
IT柚子的头像IT柚子
上一篇 2019年3月30日 下午7:24
下一篇 2019年3月30日 下午7:29

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注