sunny123456

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

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

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

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

  1. namespace MvcApp.Fileters
  2. {
  3. public class QQNumberAttribute : RegularExpressionAttribute
  4. {
  5. public QQNumberAttribute()
  6. : base(@"^\d{6,10}$") //这里直接调用父类的构造函数传递一个正则表达式进行验证
  7. {
  8. this.ErrorMessage = "{0}不是合法的QQ好,QQ号是6-10位数字";
  9. //这个{0} 是一个占位符,表示输入的QQ号码,当然我们也可以不要这个占位符的。
  10. }
  11. }
  12. }

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

  1. public class UserInfo
  2. {
  3. public int Id { get; set; }
  4. [Required]
  5. public string Namge { get; set; }
  6. //只要在这里打上这个自定义的QQNumber特性标签就可以了
  7. [QQNumber(ErrorMessage="请检查QQ号码是否正确")]
  8. public string QQ { get; set; }
  9. }

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

  1. namespace MvcApp.Fileters
  2. {
  3. //检查手机号码是否为正确
  4. //注意ValidationAttribute类是 System.ComponentModel.DataAnnotations名称空间下的
  5. public class CNPhoneNumberAttribute : ValidationAttribute
  6. {
  7. public CNPhoneNumberAttribute()
  8. {
  9. //默认的错误提示
  10. this.ErrorMessage = "手机号码应该是11位,并且以13,15,18为开头的";
  11. }
  12. public override bool IsValid(object value)
  13. {
  14. if (value is string) //检查电话号码是否为字符串格式的
  15. {
  16. string phone = (string)value;
  17. if (phone.Length == 11)
  18. {
  19. //手机号码是11位,并且以13,15,18开头的才是合法的
  20. if (phone.StartsWith("13") || phone.StartsWith("15") || phone.StartsWith("18"))
  21. {
  22. return true;
  23. }
  24. else
  25. {
  26. return false;
  27. }
  28. }
  29. return false;
  30. }
  31. return false;
  32. }
  33. }
  34. }

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

  1. public class UserInfo
  2. {
  3. public int Id { get; set; }
  4. [Required]
  5. public string Namge { get; set; }
  6. //只要在这里打上这个自定义的QQNumber特性标签就可以了
  7. [QQNumber(ErrorMessage="请检查QQ号码是否正确")]
  8. public string QQ { get; set; }
  9. [CNPhoneNumber(ErrorMessage="请检查手机号码是否正确")]
  10. public string Phone { get; set; }
  11. }


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

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

  1. using MvcApp.Models;
  2. using MvcApp.UnitClass;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Web;
  7. using System.Web.Mvc;
  8. namespace MvcApp.Controllers
  9. {
  10. public class HomeController : Controller
  11. {
  12. //
  13. // GET: /Home/
  14. public ActionResult Index(UserInfo user)
  15. {
  16. string errorsMsg=string.Empty;
  17. //实体数据是否验证通过IsValid的值为true表示验证通过,为fasle表示验证失败,有错误信息
  18. if (ModelState.IsValid)
  19. {
  20. return Content("Id=" + user.Id + "Name=" + user.Name + "QQ=" + user.QQ + "Phone=" + user.Phone);
  21. }
  22. else
  23. {
  24. //获取实体的所有错误信息,(这个方法是我自己定义的哦)
  25. errorsMsg= MvcErrorsMsgHelper.GetValidErrorsMes(ModelState);
  26. }
  27. return Content(errorsMsg);
  28. }
  29. }
  30. }


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

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Web;
  6. using System.Web.Mvc;
  7. namespace MvcApp.UnitClass
  8. {
  9. public static class MvcErrorsMsgHelper
  10. {
  11. //特别要注意:ModelStateDictionary 是在System.Web.Mvc命名空间下的
  12. public static string GetValidErrorsMes(ModelStateDictionary modelstate)
  13. {
  14. StringBuilder sb = new StringBuilder();
  15. foreach (var propName in modelstate.Keys)//遍历每个属性
  16. {
  17. //如果这个属性的错误消息<=0 那么表示数据没有错误
  18. if(modelstate[propName].Errors.Count<=0)
  19. {
  20. continue;
  21. }
  22. //一个属性可能有多个错误,那么就对这个属性的错误进行遍历
  23. foreach (var error in modelstate[propName].Errors)
  24. {
  25. sb.Append(propName+"属性验证错误:"+error.ErrorMessage);//将错误信息添加到sb中
  26. sb.Append("</br>");//换行
  27. }
  28. }
  29. return sb.ToString();
  30. }
  31. }
  32. }

验证一把:

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



posted on 2019-10-15 19:09  sunny123456  阅读(480)  评论(0)    收藏  举报