本版本延续MVC中的统一验证机制~续的这篇文章,本篇主要是对验证基类的扩展和改善
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, "这个 /"{}/"是必填的!");
messages.Add(MessageType.GreaterThan, "这个 /"{}/" 的值必须大于 /"{}/"!");
messages.Add(MessageType.LessThan, "这个 /"{}/" 的值必须小于 /"{}/"!");
messages.Add(MessageType.EmailField, "这个 /"{}/" 不是有效的Email地址!");
messages.Add(MessageType.DigitField, "这个 /"{}/" 不是有效的数字!");
messages.Add(MessageType.PostNumberField, "这个 /"{}/" 不是有效的邮编!");
messages.Add(MessageType.MobileField, "这个 /"{}/" 不是有效的手机号码!");
messages.Add(MessageType.TelePhoneField, "这个 /"{}/" 不是有效的电话号码!");
messages.Add(MessageType.FexField, "这个 /"{}/" 不是有效的传真!");
}
/// <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(, int.MaxValue, MessageType.GreaterThan, "Age", )]
public int Age { get; set; } /// <summary>
/// 体重
/// </summary>
[DisplayName("体重"), Range(int.MinValue, , MessageType.LessThan, "Weight", )]
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. MVC中的统一验证机制

    using MvcApplication2.Models;using System;using System.Collections.Generic;using System.ComponentMod ...

  2. 转载ASP.NET MVC中Session的处理机制

    本文章转载自 http://www.cnblogs.com/darrenji/p/3951065.html ASP.NET MVC中的Session以及处理方式   最近在ASP.NET MVC项目中 ...

  3. asp.net MVC 中 Session统一验证的方法

    验证登录状态的方法有:1  进程外Session   2 方法过滤器(建一个类继承ActionFilterAttribute)然后给需要验证的方法或控制器加特性标签 3 :新建一个BaseContro ...

  4. ASP.NET MVC中的统一化自定义异常处理

    当ASP.NET MVC程序出现了异常,怎么处理更加规范? 1. 最简单的方法是设置<customErrors/>节点 <customErrors>节点用于定义一些自定义错误信 ...

  5. .net mvc中session的锁机制

    今天遇到个奇怪的问题, 一个秒杀商品系统, 大量秒杀请求进来, 到了action居然是单线程执行! 这样产生的效果就是“这个系统好慢啊!!”. 可是我没有加lock,为什么会变成单线程执行呢? 找资料 ...

  6. MVC中使用Entity Framework 基于方法的查询学习笔记 (二)

    解释,不解释: 紧接上文,我们在Visual Studio2012中看到系统为我们自动创建的视图(View)文件Index.cshtml中,开头有如下这句话: @model IEnumerable&l ...

  7. mvc中常见的属性验证

    客户端验证逻辑会对用户向表单输入的数据给出一个即时反馈.而之所以需要服务器端验证,是因为来自网络的信息都是不能被信任的. 当在ASP.NET MVC设计模式上下文中谈论验证时,主要关注的是验证模型的值 ...

  8. ASP.NET Core MVC 中的 [Controller] 和 [NonController]

    前言 我们知道,在 MVC 应用程序中,有一部分约定的内容.其中关于 Controller 的约定是这样的. 每个 Controller 类的名字以 Controller 结尾,并且放置在 Contr ...

  9. Asp.Net MVC中使用StreamReader读取“Post body”之应用场景。

    场景:有三个市场(Global.China.USA),对前台传过来的数据有些验证需要细化到每个市场去完成. 所以就出现了基类(Global)和派生类(China.USA) 定义基类(Global)Pe ...

随机推荐

  1. Php面向对象 – 类常量

    Php面向对象 – 类常量 类常量:类中,保存执行周期内,不变的数据. 定义: constkeyword const 常量名 = 常量值 样例: class Student { public  $st ...

  2. C# js 在页面能执行,放在单独js文件不能执行

    我们先来看看MVC中生成的 注意:url.Content 生成的路径 Html.ActionLink 与 Url.Action 1.两者者是根据给定的Controller,Action 生成链接, 但 ...

  3. 指定webapi 返回 json 格式 ; GlobalConfiguration.Configuration.Formatters.Clear()

    因为 Internet Explorer 和 Firefox 发送了不同的 Accept 头,所以 web API 在响应里就发送了不同的内容类型.   解决方法,在 Global.asax的 App ...

  4. 3d md5 demo

    描述:场景3dmax做的,随便拖的几个东西 模型玩过游戏的都知道是doom3的怪兽猪脚 音频是openal播放的wav文件 下载地址:http://pan.baidu.com/s/1eQ8SYI2

  5. chrome浏览器表单自动填充默认样式(背景变黄)-autofill

    之所以出现这样的样式, 是因为Chrome会自动为input增加如下样式. 这个样式的优先级也比较高. 无法通过important覆盖(这就比较恶心了). 解决方案(3种): 1. 关闭自动保存账号密 ...

  6. Node.js之 EventLoop 理解(转)

    关于Node.js的第一个基本概念是I/O操作开销是巨大的: 所以,当前变成技术中最大的浪费来自于等待I/O操作的完成.有几种方法可以解决性能的影响: 同步方式:按次序一个一个的处理请求.利:简单:弊 ...

  7. c语言中左移、右移中的高位需要注意

    有符号数,左移可能会破坏符号位. 右移时,要注意高位符号. 0X表示十六进制.十六进制每位数值由 0-f表示.所以0XC0 对应 二进制为 11000000B10进制与16进制间关系:1 -- 0X1 ...

  8. spring核心之AOP学习总结二

    一:springAOP常用的注解 @Aspect:声明方面组件 @Before:声明前置通知 @After-returning:声明后置通知 @After:声明最终通知 @Around:声明环绕通知 ...

  9. python中,数字类型计算

    说明: 今天在看python数字类型的操作,在此记录下. 操作过程: 1.数字的加减乘除 >>> 2 + 24>>> 4 - 22>>> 2 - ...

  10. linq to xml 增删查改

    一.XML基本概述 XML文件是一种常用的文件格式,例如WinForm里面的app.config以及Web程序中的web.config文件,还有许多重要的场所都有它的身影.Xml是Internet环境 ...