sunny123456

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  1796 随笔 :: 22 文章 :: 24 评论 :: 226万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

MVC 自定义数据校验规则 Validation
原文链接 https://blog.csdn.net/fanbin168/article/details/79549024

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请求



posted on   sunny123456  阅读(467)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示