MVC 自定义数据校验规则 Validation

走远了吗. 提交于 2019-12-01 10:14:19

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



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!