MVC 自定义数据校验规则 Validation

MVC 数据验证,自定义验证规则

1>如果这个验证能直接用正则表达式进行校验的话,那我们就新建一个类,让它继承自RegularExpressionAttribute类

namespace MvcApp.Fileters
{
    public class QQNumberAttribute : RegularExpressionAttribute
    {
        public QQNumberAttribute()
            : base(@"^\d{6,10}$") //这里直接调用父类的构造函数传递一个正则表达式进行验证
        {
            this.ErrorMessage = "{0}不是合法的QQ好,QQ号是6-10位数字";

            //这个{0} 是一个占位符,表示输入的QQ号码,当然我们也可以不要这个占位符的。
        }
    }
}

用法(在模型上打上这个特性标签就可以了):

public class UserInfo
{
    public int Id { get; set; }

    [Required]
    public string Namge { get; set; }

    //只要在这里打上这个自定义的QQNumber特性标签就可以了
    [QQNumber(ErrorMessage="请检查QQ号码是否正确")]
    public string QQ { get; set; }
}

2>如果觉得不会写正则,或者正则不方便的时候还可以这样,新建一个类,直接继承ValidationAttribute类,然后重新它的IsValid方法 验证成功返回true,验证失败返回false

namespace MvcApp.Fileters
{
    //检查手机号码是否为正确

    //注意ValidationAttribute类是 System.ComponentModel.DataAnnotations名称空间下的
    public class CNPhoneNumberAttribute : ValidationAttribute
    {
        public CNPhoneNumberAttribute()
        {
            //默认的错误提示
            this.ErrorMessage = "手机号码应该是11位,并且以13,15,18为开头的";
        }
        public override bool IsValid(object value)
        {
            if (value is string) //检查电话号码是否为字符串格式的
            {
                string phone = (string)value;
                if (phone.Length == 11)
                {
                    //手机号码是11位,并且以13,15,18开头的才是合法的
                    if (phone.StartsWith("13") || phone.StartsWith("15") || phone.StartsWith("18"))
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
                return false;
            }
            return false;          
        }
    }
}

用法一样(在模型上打特性标签就可以了)

public class UserInfo
{
    public int Id { get; set; }

    [Required]
    public string Namge { get; set; }

    //只要在这里打上这个自定义的QQNumber特性标签就可以了
    [QQNumber(ErrorMessage="请检查QQ号码是否正确")]
    public string QQ { get; set; }

    [CNPhoneNumber(ErrorMessage="请检查手机号码是否正确")]
    public string Phone { get; set; }
}


具体在控制器中怎么使用:

这里主要是使用System.Web.Mvc命名空间下的一个ModelStateDictionary类型的ModelState属性,判断他的IsValid属性是否为true,为true表示验证通过,为false表示验证失败,实体数据有错误。

using MvcApp.Models;
using MvcApp.UnitClass;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MvcApp.Controllers
{
    public class HomeController : Controller
    {
        //
        // GET: /Home/

        public ActionResult Index(UserInfo user)
        {
            string errorsMsg=string.Empty;
            //实体数据是否验证通过IsValid的值为true表示验证通过,为fasle表示验证失败,有错误信息
            if (ModelState.IsValid)
            {
                return Content("Id=" + user.Id + "Name=" + user.Name + "QQ=" + user.QQ + "Phone=" + user.Phone); 
            }
            else
            {
                //获取实体的所有错误信息,(这个方法是我自己定义的哦)
                 errorsMsg= MvcErrorsMsgHelper.GetValidErrorsMes(ModelState);
            }
            return Content(errorsMsg);
        }

    }
}


在这里自己封装一个获取System.Web.Mvc.ModelStateDictionary 字典类中的实体验证的错误消息的类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Mvc;

namespace MvcApp.UnitClass
{
    public static class MvcErrorsMsgHelper
    {
        //特别要注意:ModelStateDictionary 是在System.Web.Mvc命名空间下的
        public static string GetValidErrorsMes(ModelStateDictionary modelstate)
        {
            StringBuilder sb = new StringBuilder();
            foreach (var propName in modelstate.Keys)//遍历每个属性
            { 
                //如果这个属性的错误消息<=0 那么表示数据没有错误
                if(modelstate[propName].Errors.Count<=0)
                {
                    continue;
                }
                //一个属性可能有多个错误,那么就对这个属性的错误进行遍历
                foreach (var error in modelstate[propName].Errors)
                {
                    sb.Append(propName+"属性验证错误:"+error.ErrorMessage);//将错误信息添加到sb中
                    sb.Append("</br>");//换行
                }
            }
            return sb.ToString();
        }
    }
}

验证一把:

运行程序,直接在浏览器中输入Get请求



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring MVC有许多常用的注解,用于标记和配置控制器、请求映射、数据绑定、视图解析等功能。以下是一些常见的Spring MVC注解: 1. @Controller: 标记一个类为Spring MVC的控制器,处理请求并返回响应。 2. @RequestMapping: 用于映射请求URL到控制器的处理方法。可以用在类级别上标记控制器,也可以用在方法级别上标记处理方法。 3. @GetMapping, @PostMapping, @PutMapping, @DeleteMapping: 是@RequestMapping的缩写,分别用于标记处理GET、POST、PUT、DELETE请求的方法。 4. @PathVariable: 用于将URL的路径参数绑定到方法的参数上。 5. @RequestParam: 用于将请求参数绑定到方法的参数上。 6. @RequestBody: 用于将请求体数据绑定到方法的参数上,常用于接收JSON或XML格式的数据。 7. @ResponseBody: 用于将方法的返回值直接写入响应体,常用于返回JSON或XML格式的数据。 8. @ModelAttribute: 用于将请求参数绑定到模型对象上,常用于表单提交时的数据绑定。 9. @Valid: 用于开启对模型对象的数据校验,通常与javax.validation的注解一起使用。 10. @SessionAttributes: 用于将模型的属性暂存到会话(Session),以供多个请求之间共享。 11. @InitBinder: 用于配置数据绑定器,可以自定义数据绑定的规则和格式。 这些只是Spring MVC的一部分常用注解,还有其他更多的注解用于处理拦截器、异常处理、视图解析等功能。详细的注解使用可以参考Spring MVC的官方文档或相关教程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值