欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MVC 自定义验证规则ValidationAttribute的使用

程序员文章站 2022-06-11 22:42:33
...

直接或者继承自ValidationAttribute。

如果能用正则表达式校验的直接从RegularExpressionAttribute继承。 public class QQNumberAttribute : RegularExpressionAttribute { public QQNumberAttribute() : base(@"^\d{5,10}$")//不要忘了^$ { this.ErrorMessage = "{0}属性不是合法的QQ号,QQ号需要5-10位数字"; //设定ErrorMessage的默认值。使用的人也可以覆盖这个值 } } 手机号的正则表达式:@"^1(3[0-9]|4[57]|5[0-35-9]|7[01678]|8[0-9])\d{8}$"

直接继承自ValidationAttribute,重写IsValid方法 比如校验中国电话号码合法性 public class CNPhoneNumAttribute:ValidationAttribute { public CNPhoneNumAttribute() { this.ErrorMessage = "电话号码必须是固话或者手机,固话要是3-4位区号开头,手机必须以13、15、18、17开头"; } //注意,不要override ValidationResult IsValid(object value, ValidationContext validationContext) public override bool IsValid(object value) { if(value is string) { string s = (string)value; if(s.Length==13)//手机号 { if(s.StartsWith("13")|| s.StartsWith("15") || s.StartsWith("17") || s.StartsWith("18")) { return true; } else { return false; } } else if(s.Contains("-"))//固话 { //010,021 0755 0531 string[] strs = s.Split('-'); if(strs[0].Length==3|| strs[0].Length==4) { return true; } else { return false; } } else { return false; } } else { return false; } } }

Models代码:

在这里插入代码片using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;

namespace Layout.Models
{
    public class Number
    {
        [PhNumber]
        [Required(ErrorMessage = "必填项")]
        public string Tel { get; set; }
        [QQNumber]
        [Required(ErrorMessage ="必填项")]
        public string QQ { get; set; }
    }
}

视图层代码:


@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div>
        <form action="~/QQNumber/Index" method="post">
            Q  Q:<input type="text" name="QQ" value="" /><br />
            电话:<input type="text" name="Tel" value="" /><br />
                  <input type="submit" value="提交" />
        </form> 
    </div>
</body>
</html>

控制器代码:

using Layout.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace Layout.Controllers
{
    public class QQNumberController : Controller
    {
        [HttpGet]
        public ActionResult Index()
        {
            return View();
        }
        [HttpPost]
        public ActionResult Index(Number Number)
        {
            if (ModelState.IsValid)
            {
                var script = String.Format("<script>alert('输入正确!');location.href='{0}'</script>", Url.Action("Index"));
                return Content(script, "text/html");
            }
            else
            {
                string msg = Vaildate.GetError(ModelState);
                return Content(msg);
            }
        }
    }
}

新建一个类,记录错误:

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

namespace Layout
{
    public static class Vaildate
    {
        public static string GetError(ModelStateDictionary modelState)
        {
            StringBuilder builder = new StringBuilder();
            foreach (var item in modelState.Keys)
            {
                if (modelState[item].Errors.Count <= 0)
                {
                    continue;
                }
                builder.Append("属性【").Append(item).Append("】错误<br/>");
                foreach (var error in modelState[item].Errors)
                {
                    builder.AppendLine(error.ErrorMessage+"<br/>");
                }
            }
            return builder.ToString();
        }
    }
}

新建一个类记录QQ的验证:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;

namespace Layout
{
    public class QQNumber : RegularExpressionAttribute
    {
        public QQNumber() : base(@"^\d{5,10}$")
        {
            this.ErrorMessage = "{0}属性不是合法的QQ号,QQ号需要5-10位数字"; //设定ErrorMessage的默认值。使用的人也可以覆盖这个值
        }
    }
}

新建一个类记录电话的验证:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;

namespace Layout
{
    public class PhNumber : ValidationAttribute
    {
        public PhNumber()
        {
            this.ErrorMessage = "电话号码必须是固话或者手机,固话要是3-4位区号开头,手机必须以13、15、18、17开头";
        }
        public override bool IsValid(object value)
        {
            if (value is string)
            {
                string s = (string)value; if (s.Length == 13)//手机号 
                {
                    if (s.StartsWith("13") || s.StartsWith("15") || s.StartsWith("17") || s.StartsWith("18"))
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
                else if (s.Contains("-"))//固话 
                {
                    //010,021 0755 0531 
                    string[] strs = s.Split('-');
                    if (strs[0].Length == 3 || strs[0].Length == 4)
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
                else
                {
                    return false;
                }
            }
            else
            {
                return false;
            }
        }
    }
}