namespace Web.Mvc.Extensions
{ #region 验证基类
/// <summary>
/// 通用验证基类
/// </summary>
public abstract class EntityValidationAttribute : ValidationAttribute
{
#region Constructors
public EntityValidationAttribute(MessageType messageId, params object[] args) :
base(() => MessageManager.Current.GetMessage(messageId, args)) { }
#endregion #region Protected Properties
protected virtual Regex rLetters { get { return new Regex("[a-zA-Z]{1,}"); } }
/// <summary>
/// 验证数字
/// 子类可以根据自己的逻辑去重写
/// </summary>
protected virtual Regex rDigit { get { return new Regex("[0-9]{1,}"); } }
/// <summary>
/// 验证邮编
/// 子类可以根据自己的逻辑去重写
/// </summary>
protected virtual Regex rPostNumber { get { return new Regex("^[0-9]{3,14}$"); } }
/// <summary>
/// 验证手机
/// 子类可以根据自己的逻辑去重写
/// </summary>
protected virtual Regex rMobile { get { return new Regex(@"^1[3|4|5|8][0-9]\d{8}$"); } }
/// <summary>
/// 验证电话
/// 子类可以根据自己的逻辑去重写
/// </summary>
protected virtual Regex rTelePhone { get { return new Regex(@"^[0-9]{2,4}-\d{6,8}$"); } }
/// <summary>
/// 验证传真
/// 子类可以根据自己的逻辑去重写
/// </summary>
protected virtual Regex rFex { get { return new Regex(@"/^[0-9]{2,4}-\d{6,8}$"); } }
/// <summary>
/// 验证Email
/// 子类可以根据自己的逻辑去重写
/// </summary>
protected virtual Regex rEmail { get { return new Regex(@"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$"); } }
#endregion }
#endregion #region 具体验证模块
/// <summary>
/// 为空验证
/// </summary>
[AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
public class RequiredAttribute : EntityValidationAttribute
{
public bool AllowEmptyStrings { get; set; }
public RequiredAttribute(MessageType messageType, params object[] args) :
base(messageType, args)
{ }
public override bool IsValid(object value)
{
return new System.ComponentModel.DataAnnotations.RequiredAttribute { AllowEmptyStrings = this.AllowEmptyStrings }.IsValid(value);
}
}
/// <summary>
/// 范围验证
/// </summary>
[AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
public class RangeAttribute : EntityValidationAttribute
{
private System.ComponentModel.DataAnnotations.RangeAttribute innerRangeAttribute; public RangeAttribute(double minimum, double maximum, MessageType messageType, params object[] args) :
base(messageType, args)
{
innerRangeAttribute = new System.ComponentModel.DataAnnotations.RangeAttribute(minimum, maximum);
} public RangeAttribute(int minimum, int maximum, MessageType messageType, params object[] args) :
base(messageType, args)
{
innerRangeAttribute = new System.ComponentModel.DataAnnotations.RangeAttribute(minimum, maximum);
} public RangeAttribute(Type type, string minimum, string maximum, MessageType messageType, params object[] args) :
base(messageType, args)
{
innerRangeAttribute = new System.ComponentModel.DataAnnotations.RangeAttribute(type, minimum, maximum);
} public override bool IsValid(object value)
{
return innerRangeAttribute.IsValid(value);
}
} /// <summary>
/// Email验证
/// </summary>
[AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
public class EmailAttribute : EntityValidationAttribute
{
public EmailAttribute(MessageType messageType, params object[] args) :
base(messageType, args) { }
public override bool IsValid(object value)
{
if (value == null)
return false;
else
return rEmail.IsMatch(value.ToString());
}
} /// <summary>
/// 数值验证
/// </summary>
[AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
public class DigitAttribute : EntityValidationAttribute
{
public DigitAttribute(MessageType messageType, params object[] args) :
base(messageType, args) { }
public override bool IsValid(object value)
{
if (value == null)
return false;
else
return rDigit.IsMatch(value.ToString());
} } /// <summary>
/// 邮编验证
/// </summary>
[AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
public class PostNumberAttribute : EntityValidationAttribute
{
public PostNumberAttribute(MessageType messageType, params object[] args) :
base(messageType, args) { }
public override bool IsValid(object value)
{
if (value == null)
return false;
else
return rPostNumber.IsMatch(value.ToString());
} } /// <summary>
/// 手机验证
/// </summary>
[AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
public class MobileAttribute : EntityValidationAttribute
{
public MobileAttribute(MessageType messageType, params object[] args) :
base(messageType, args) { }
public override bool IsValid(object value)
{
if (value == null)
return false;
else
return rMobile.IsMatch(value.ToString());
}
} /// <summary>
/// 电话验证
/// </summary>
[AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
public class TelePhoneAttribute : EntityValidationAttribute
{
public TelePhoneAttribute(MessageType messageType, params object[] args) :
base(messageType, args) { }
public override bool IsValid(object value)
{
if (value == null)
return false;
else
return rTelePhone.IsMatch(value.ToString());
}
} /// <summary>
/// 传真验证
/// </summary>
[AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
public class FexAttribute : EntityValidationAttribute
{
public FexAttribute(MessageType messageType, params object[] args) :
base(messageType, args) { }
public override bool IsValid(object value)
{
if (value == null)
return false;
else
return rFex.IsMatch(value.ToString());
}
}
#endregion #region 验证消息返回类
/// <summary>
/// 消息类
/// </summary>
public class MessageManager
{
static Dictionary<MessageType, string> messages = new Dictionary<MessageType, string>();
static MessageManager()
{
messages.Add(MessageType.RequiredField, "这个 \"{0}\"是必填的!");
messages.Add(MessageType.GreaterThan, "这个 \"{0}\" 的值必须大于 \"{1}\"!");
messages.Add(MessageType.LessThan, "这个 \"{0}\" 的值必须小于 \"{1}\"!");
messages.Add(MessageType.EmailField, "这个 \"{0}\" 不是有效的Email地址!");
messages.Add(MessageType.DigitField, "这个 \"{0}\" 不是有效的数字!");
messages.Add(MessageType.PostNumberField, "这个 \"{0}\" 不是有效的邮编!");
messages.Add(MessageType.MobileField, "这个 \"{0}\" 不是有效的手机号码!");
messages.Add(MessageType.TelePhoneField, "这个 \"{0}\" 不是有效的电话号码!");
messages.Add(MessageType.FexField, "这个 \"{0}\" 不是有效的传真!");
}
/// <summary>
/// 得到验证异常的消息集合
/// 对外公开
/// </summary>
/// <param name="messageType">异常消息ID</param>
/// <param name="args">消息参数集合</param>
/// <returns></returns>
public string GetMessage(MessageType messageType, params object[] args)
{
return string.Format(CultureInfo.CurrentCulture, messages[messageType], args);
}
/// <summary>
/// 本类的实例对象
/// </summary>
public static MessageManager Current = new MessageManager();
} #endregion #region 验证类型枚举
/// <summary>
/// 验证消息类型
/// </summary>
public enum MessageType
{
/// <summary>
/// 为空验证
/// </summary>
RequiredField,
/// <summary>
/// 大于验证
/// </summary>
GreaterThan,
/// <summary>
/// 小于验证
/// </summary>
LessThan,
/// <summary>
/// 邮箱验证
/// </summary>
EmailField,
/// <summary>
/// 数字验证
/// </summary>
DigitField,
/// <summary>
/// 邮编验证
/// </summary>
PostNumberField,
/// <summary>
/// 手机验证
/// </summary>
MobileField,
/// <summary>
/// 电话验证
/// </summary>
TelePhoneField,
/// <summary>
/// 传真验证
/// </summary>
FexField,
}
#endregion } 完整的实体为: /// <summary>
/// 人类实体
/// </summary>
public class Person
{
/// <summary>
/// 姓名
/// </summary>
[DisplayName("姓名"), Required(MessageType.RequiredField, "Name")]
public string Name { get; set; } /// <summary>
/// 年纪
/// </summary>
[DisplayName("年纪"), Range(18, int.MaxValue, MessageType.GreaterThan, "Age", 18)]
public int Age { get; set; } /// <summary>
/// 体重
/// </summary>
[DisplayName("体重"), Range(int.MinValue, 160, MessageType.LessThan, "Weight", 160)]
public double Weight { get; set; } /// <summary>
/// 电子邮件
/// </summary>
[DisplayName("电子邮件"), Email(MessageType.EmailField, "电子邮件")]
public string Email { get; set; } /// <summary>
/// 手机
/// </summary>
[DisplayName("手机"), Mobile(MessageType.MobileField, "Mobile")]
public string Mobile { get; set; } /// <summary>
/// 电话
/// </summary>
[DisplayName("电话"), TelePhone(MessageType.TelePhoneField, "TelePhone")]
public string TelePhone { get; set; } /// <summary>
/// 邮编
/// </summary>
[DisplayName("邮编"), PostNumber(MessageType.PostNumberField, "PostNumber")]
public string PostNumber { get; set; } /// <summary>
/// 传真
/// </summary>
[DisplayName("传真"), Fex(MessageType.FexField, "Fex")]
public string Fex { get; set; }
}

  

Mvc_后端通用验证的更多相关文章

  1. c#后台输出javascript语句和一些通用验证的类

    大家在用MVC的时候,经常会用到MODEL层的验证或者是正则表达式,我这边看到了一篇不错的文章,转载过来http://blog.csdn.net/accpxcb/article/details/311 ...

  2. NetCore3.1及Vue开发通用RBAC前后端通用框架

    目录 框架说明 项目框架图 多租户权限设计表 效果图 后端拉取运行 前端项目请参考 前端系列 发布到docker中 netcore3.1 发布到docker中所遇到的坑及解决 框架说明 该框架是本人学 ...

  3. 爱上MVC系列~前端验证与后端数据有效性验证

    回到目录 有一句话,在10年前就是真理,到现在也一直都是,“前端验证可以没有,但后端验证必须要有”,这句话相信大家都没有意见吧,前端验证一般指通过JS方式实现的,友好的,个性的验证方式,而后端验证是指 ...

  4. C# 通用验证类 支持 WPF,MVC,Winform

    验证方式,   通过继承 IDataErrorInfo接口 和 DataAnnotations 解释标记语言而实现, 为了能在WPF上通用,所了也要继承属性更改通知接口INotifyPropertyC ...

  5. jQuery前端数据通用验证库,解放你的双手

    这个简易的验证库,应该能完成90%的基本验证,包括失去焦点时的验证,以及点击提交按钮时的验证.后端的那我就无能为办了,只能是谁用就谁自个儿去写了:). 先上一段调用的代码吧,JS代码说少也不少了,就不 ...

  6. FluentValidation:C#后端输入验证框架的官方文档解读

    参照 FluentValidation 的官方文档写的例子,方便日后查看和使用. 原文:https://github.com/JeremySkinner/FluentValidation/wiki H ...

  7. Js通用验证

    //-----------------------------------------------------js 验证封装 zhy2014-07-10------------------------ ...

  8. AJAX 前后端交互 验证信息是否正确

    1.前段: function checkPtCode(obj){ $.ajax({ type: "post", url: "xxxxxxx", data: {& ...

  9. Django前后端安全验证

    会话技术 关注公众号"轻松学编程"了解更多. 1.Cookie 客户端会话技术(数据存储在客户端) 以key-value的形式进行存储 cookie的操作都是通过Response来 ...

随机推荐

  1. Python鸢尾花分类实现

    #coding:utf-8 from sklearn.datasets import load_irisfrom sklearn.model_selection import train_test_s ...

  2. 纯CSS选项卡

    html: <!doctype html> <html> <head> <meta charset="utf-8"> <tit ...

  3. DMZ 区域

    下面对DMZ区域进行简要介绍:DMZ是网络的一个区域,介于外网与内网之间的一个特殊区域,也称隔离区.它不同于传统的防火墙设置,DMZ防火墙方案为要保护的内部网络增加了一道安全防线,通常认为是非常安全的 ...

  4. MyEclipse10或者eclipse中配置开发Python的Pydev插件安装教程

    注意使用LiClipse的用户 PyDev已经预装在LiClipse中,所以可以跳过这一步(请注意,如果使用LiClipse,PyDev不能单独安装或更新,因为它必须始终作为一个整体更新). 必需品 ...

  5. C++基础算法学习——猜假币

    有12枚硬币.其中有11枚真币和1枚假币.假币和真币重量不同,但不知道假币比真币轻还是重.现在,用一架天平称了这些币三次,告诉你称的结果,请你找出假币并且确定假币是轻是重(数据保证一定能找出来).例题 ...

  6. Frameworks(不定时更新)

    iOS8.4 Frameworks 更新时间:2015年8月17日 Accelerate iOS4.0引入了Accelerate框架,该框架的接口可用于执行数学.大数字以及DSP运算.和开发者个人编写 ...

  7. JS思维导图(转)

    思维导图不得不说是学习及温习的极佳方法,这里转载一波网上他人的精品JS思维导图十张,共同学习,如有冒犯原著可联系本人及时处理.

  8. PyQt5--QSplitter

    # -*- coding:utf-8 -*- ''' Created on Sep 20, 2018 @author: SaShuangYiBing Comment: ''' import sys f ...

  9. Jedis关于Set的API Demo

    package com.daxin.jedis_datastructure; import java.util.Set; import org.junit.After; import org.juni ...

  10. <数据结构与算法分析>读书笔记--模型

    为了在正式的构架中分析算法,我们需要一个计算模型.我们的模型基本上是一台标准的计算机,在机器中指令被顺序地执行.该模型有一个标准的简单指令系统,如加法.乘法.比较和赋值等.但不同于实际计算机情况的是, ...