using MvcApplication2.Models;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
using System.Globalization;
using System.Text.RegularExpressions;
using System.Web.Security;

namespace MvcApplication2.Models
{
#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("电子邮件"), 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中的统一验证机制~续的这篇文章,本篇主要是对验证基类的扩展和改善(转)

    本版本延续MVC中的统一验证机制~续的这篇文章,本篇主要是对验证基类的扩展和改善 namespace Web.Mvc.Extensions { #region 验证基类 /// <summary ...

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

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

  3. ASP.NET MVC中使用窗体验证出现上下文的模型在数据库创建后发生更改,导致调试失败(一)

    在ASP.NET MVC中使用窗体验证.(首先要明白,验证逻辑是应该加在Model.View和Controller哪一个里面?由于Model的责任就是负责信息访问与商业逻辑验证的,所以我们把验证逻辑加 ...

  4. asp.net mvc 中的自定义验证(Custom Validation Attribute)

    前言

  5. 定制Asp.NET 5 MVC内建身份验证机制 - 基于自建SQL Server用户/角色数据表的表单身份验证

    背景 在需要进行表单认证的Asp.NET 5 MVC项目被创建后,往往需要根据项目的实际需求做一系列的工作对MVC 5内建的身份验证机制(Asp.NET Identity)进行扩展和定制: Asp.N ...

  6. asp.net mvc中的后台验证

    asp.net mvc的验证包含后台验证和前端验证.后台验证主要通过数据注解的形式实现对model中属性的验证,其验证过程发生在model绑定的过程中.前端验证是通过结合jquery.validate ...

  7. .NET MVC中的数据验证

    一  概述 关于数据验证和数据注解,是任何软件系统不可小觑的必要模块,主要作用是为了保证数据安全性.防止漏洞注入和网络攻击.从数据验证的验证方式来说,我们一般分为客户端验证和服务端验证(或者两种方式相 ...

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

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

  9. spring mvc controller中的参数验证机制(二)

    这里我们介绍以下自定义的校验器的简单的使用示例 一.包结构和主要文件 二.代码 1.自定义注解文件MyConstraint package com.knyel.validator; import ja ...

随机推荐

  1. xampp 访问出现New XAMPP security concept 或者 新しいXAMPPのセキュリティコンセプト

    出现如下错误: 新しいXAMPPのセキュリティコンセプト: は.要求されたオブジェクトへのアクセスは.ローカルネットワークから入手可能です. この設定は.ファイル"で設定することができますの ...

  2. ORM Entities vs. Domain Entities under Entity Framework 6.0

    I stumbled upon the following two articles First and Second in which the author states in summary th ...

  3. OpenGL绘制自由落体小球

    OpenGL绘制自由落体小球 一.    程序运行的软硬件环境 本次设计在window10系统下进行,运用C++进行编写,在CodeBlocks环境下使用OpenGL进行设计. 所需环境配置分为2部分 ...

  4. 【原】Spark中Client源码分析(一)

    在Spark Standalone中我们所谓的Client,它的任务其实是由AppClient和DriverClient共同完成的.AppClient是一个允许app(Client)和Spark集群通 ...

  5. HW5.21

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...

  6. oracle创建表空间语句分解

    1 create tablespace db_name 2 datafile 'D:\oracle\product\10.2.0\oradata\orcl\db_name_.dbf' size 200 ...

  7. 数据中心基础设施自动化运维之puppet专项

    http://forge.puppetlabs.com/treydock/yum_cron  [puppet功能扩展forge] http://docs.puppetlabs.com/referenc ...

  8. Stream消息流 和 Stream Grouping 消息流组

  9. Spark源码的编译过程详细解读(各版本)

    说在前面的话   重新试多几次.编译过程中会出现下载某个包的时间太久,这是由于连接网站的过程中会出现假死,按ctrl+c,重新运行编译命令. 如果出现缺少了某个文件的情况,则要先清理maven(使用命 ...

  10. 北京Uber优步司机奖励政策(2月3日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...