MVC中的统一验证机制
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中的统一验证机制的更多相关文章
- 本版本延续MVC中的统一验证机制~续的这篇文章,本篇主要是对验证基类的扩展和改善(转)
本版本延续MVC中的统一验证机制~续的这篇文章,本篇主要是对验证基类的扩展和改善 namespace Web.Mvc.Extensions { #region 验证基类 /// <summary ...
- asp.net MVC 中 Session统一验证的方法
验证登录状态的方法有:1 进程外Session 2 方法过滤器(建一个类继承ActionFilterAttribute)然后给需要验证的方法或控制器加特性标签 3 :新建一个BaseContro ...
- ASP.NET MVC中使用窗体验证出现上下文的模型在数据库创建后发生更改,导致调试失败(一)
在ASP.NET MVC中使用窗体验证.(首先要明白,验证逻辑是应该加在Model.View和Controller哪一个里面?由于Model的责任就是负责信息访问与商业逻辑验证的,所以我们把验证逻辑加 ...
- asp.net mvc 中的自定义验证(Custom Validation Attribute)
前言
- 定制Asp.NET 5 MVC内建身份验证机制 - 基于自建SQL Server用户/角色数据表的表单身份验证
背景 在需要进行表单认证的Asp.NET 5 MVC项目被创建后,往往需要根据项目的实际需求做一系列的工作对MVC 5内建的身份验证机制(Asp.NET Identity)进行扩展和定制: Asp.N ...
- asp.net mvc中的后台验证
asp.net mvc的验证包含后台验证和前端验证.后台验证主要通过数据注解的形式实现对model中属性的验证,其验证过程发生在model绑定的过程中.前端验证是通过结合jquery.validate ...
- .NET MVC中的数据验证
一 概述 关于数据验证和数据注解,是任何软件系统不可小觑的必要模块,主要作用是为了保证数据安全性.防止漏洞注入和网络攻击.从数据验证的验证方式来说,我们一般分为客户端验证和服务端验证(或者两种方式相 ...
- 转载ASP.NET MVC中Session的处理机制
本文章转载自 http://www.cnblogs.com/darrenji/p/3951065.html ASP.NET MVC中的Session以及处理方式 最近在ASP.NET MVC项目中 ...
- spring mvc controller中的参数验证机制(二)
这里我们介绍以下自定义的校验器的简单的使用示例 一.包结构和主要文件 二.代码 1.自定义注解文件MyConstraint package com.knyel.validator; import ja ...
随机推荐
- Problems encountered while deleting resources.
Error The project was not built due to “Problems encountered while deleting resources.”. Fix the pro ...
- BOM(浏览器对象模型)的一些内置对象总结
1.window对象 BOM的核心对象是window,它表示浏览器的一个实例,它也是ECMAScript规定的Globle对象,也就是说网页中任何一个对象都是在window这个对象里面的.如果有用到框 ...
- NOIP2002 均分纸牌
题一 均分纸牌 (存盘名: NOIPG1) [问题描述] 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,但纸牌总数必为 N 的倍数.可以在任一堆上取若于张纸牌,然后移动. 移牌规则为: ...
- mysql日志清理
mysql bin-log 日志清理 发现mysql数据库目录中bin-log中日志文件非常大 [root@localhost var]# du -sh mysql-bin* | sort 1020K ...
- Asp.net多行文本框随内容增加而高度增加
最近做一个项目,在一个多行文本框(TextBox)里显示新闻内容,由于内容有多有少,并且总是出现垂直滚动条,很不好看,笔者就想用一个法子,去掉垂直滚动条,并且文本框的高度随内容的增加而变大,使高度适应 ...
- layer (jQuery弹出层插件)使用
$(".delete").click(function(){ var work_name = $(this).data('name'); var item_id = $(this) ...
- Sqlite在Windows、Linux 和 Mac OS X 上的安装过程
一:在 Windows 上安装 SQLite 1,下载 请访问SQLite下载页面http://www.sqlite.org/download.html,从Windows 区下载预编译的二进制文件.需 ...
- Redis_基本类型介绍和指令___2
1.hash Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象. Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿). ...
- Objective-C中一种消息处理方法performSelector: withObject:
Objective-C中调用函数的方法是“消息传递”,这个和普通的函数调用的区别是,你可以随时对一个对象传递任何消息,而不需要在编译的时候声明这些方法.所以Objective-C可以在runtime的 ...
- int& a = b 的思考
在PCL显示点云部分程序中,涉及到了如下程序 // 定义相关变量 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_ptr (new pcl::Point ...