能递归检查DataAnnotations的验证函数
有时在Command和DTO之间层次比较多,写了个验证Command的函数,能实现递归验证.
比如下面这些有层级关系的class定义,能通过一句代码来进行验证:
class A
{
[Required]
public B B { get; set; }
} class B
{
[Range(, )]
public int C { get; set; } [Range(typeof(Guid), "00000000-0000-0000-0000-000000000001", "00000000-0000-0000-0000-000000000010")]
public Guid aa { get; set; } public CC ddd { get; set; }
}
class CC
{
[Range(, )]
public int DDDDD { get; set; } [Required(ErrorMessage = "必须填写用户名")]
[Display(Name = "用户名")]
public string UserName { get; set; } [Required(ErrorMessage = "必须填写密码")]
[DataType(DataType.Password)]
[Display(Name = "密码")]
public string Password { get; set; }
}
验证函数调用:
List<BrokenRule> errors = obj.IsValid();
代码如下:
public class BrokenRule
{
public string Key { get; set; }
public string Message { get; set; }
} public static class DataAnnotationHelper
{
public static List<BrokenRule> IsValid<T>(this T o, bool only1Level = false)
{
return IsValid(typeof(T), o, only1Level);
} private static List<BrokenRule> IsValid(Type t, object o, bool only1Level)
{
List<BrokenRule> errors = new List<BrokenRule>(); var descriptor = GetTypeDescriptor(t); foreach (PropertyDescriptor propertyDescriptor in descriptor.GetProperties())
{
foreach (var validationAttribute in propertyDescriptor.Attributes.OfType<ValidationAttribute>())
{
if (!validationAttribute.IsValid(propertyDescriptor.GetValue(o)))
{
BrokenRule error = new BrokenRule();
error.Key = propertyDescriptor.Name;
error.Message = validationAttribute.FormatErrorMessage(propertyDescriptor.Name);
errors.Add(error);
}
}
} if (!only1Level)
{
if (o.GetType().IsClass&&!o.GetType().Equals(typeof(string)))
{
foreach (var p in o.GetType().GetProperties())
{
object pValue = p.GetValue(o, null);
if (pValue != null)
{
List<BrokenRule> pErrors = IsValid(p.PropertyType, pValue, only1Level);
errors.AddRange(pErrors);
}
}
}
} return errors;
}
private static ICustomTypeDescriptor GetTypeDescriptor(Type type)
{
return new AssociatedMetadataTypeTypeDescriptionProvider(type).GetTypeDescriptor(type);
}
}
效果图:
能递归检查DataAnnotations的验证函数的更多相关文章
- JavaScript验证函数大全
1. 长度限制 <script> function test() { if(document.a.b.value.length>50) { alert("不能超过50个字符 ...
- c#md5与SHA1验证函数
/// <summary> /// MD5验证函数 /// </summary> /// <param name="fileName">文件的路 ...
- JS通用表单验证函数,基于javascript正则表达式
表单的验证在实际的开发当中是件很烦琐又无趣的事情今天在做一个小项目的时候,需要JS验证,寻找到一个比较好的东西 地址如下: http://blog.csdn.net/goodfunman/archiv ...
- php信用卡卡号验证函数
介绍一个php信用卡卡号验证函数,可以验证一个卡号是否是信用卡. function validateCard ($cardnumber){ $cardnumber = preg_replace (&q ...
- Oracle11g R2创建PASSWORD_VERIFY_FUNCTION对应密码复杂度验证函数步骤
Oracle11g R2创建PASSWORD_VERIFY_FUNCTION对应密码复杂度验证函数步骤 运行测试环境:数据库服务器Oracle Linux 5.8 + Oracle 11g R2数据库 ...
- HTML5时代的纯前端上传图片预览及严格图片格式验证函数(转载)
原文地址:http://www.2cto.com/kf/201401/274752.html 一.要解决什么样的问题? 在写这个函数之前,有们童鞋在群里问如何纯前端严格验证图片格式.这在html5时代 ...
- C 递归 递归指的是在函数的定义中
C 递归 递归指的是在函数的定义中使用函数自身的方法. 举个例子:从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?"从前有座山,山里有座庙,庙里有个老和尚,正在给 ...
- Day05:装饰器,三元表达式,函数的递归,匿名/内置函数,迭代器,模块,开发目录
上节课复习:1.函数的对象 函数可以被当作数据取处理2.函数嵌套 嵌套调用:在调用一个函数时,函数体代码又调用了其他函数 嵌套定义:在一个函数内部又定义了另一个函数 def foo( ...
- Oracle11g R2创建PASSWORD_VERIFY_FUNCTION相应password复杂度验证函数步骤
Oracle11g R2创建PASSWORD_VERIFY_FUNCTION相应密码复杂度验证函数步骤 运行測试环境:数据库服务器Oracle Linux 5.8 + Oracle 11g R2数据库 ...
随机推荐
- python3接收、解析邮件
邮件接收 python3可以使用poplib.POP3进行邮件接收,具体如下: import poplib from email.parser import Parser def get_email( ...
- 洗礼灵魂,修炼python(69)--爬虫篇—番外篇之feedparser模块
feedparser模块 1.简介 feedparser是一个Python的Feed解析库,可以处理RSS ,CDF,Atom .使用它我们可从任何 RSS 或 Atom 订阅源得到标题.链接和文章的 ...
- 【算法】LeetCode算法题-Count And Say
这是悦乐书的第153次更新,第155篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第12题(顺位题号是38).count-and-say序列是整数序列,前五个术语如下: ...
- C语言 矩阵的转置及矩阵的乘法
C语言 矩阵的转置及矩阵的乘法 //凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1.矩阵的转置 #include<stdio.h> #defi ...
- Spring的IOC注解开发入门1
基本知识点如下: 引入注解约束,配置组件扫描 类上的注解: @Conponent @Controller @Service @Repository 普通属性的注解 @value 对象属性的注解 ...
- 《Java大学教程》—第24章 Java的背景
本章主要介绍的是Java的背景知识,通过了解历史知道Java与其他语言的区别,以便更好选择在什么场景下使用Java. 24.2 语言的尺寸Java语言短小.紧凑,以C++为基础,放弃了一些特定的 ...
- vue-cli脚手架搭建的项目怎么去除eslint验证
修改webpack.base.conf.js这个基础配置文件了.具体修改方法如下: module: { rules: [ ...(config.dev.useEslint ? [createLinti ...
- nginx学习笔记(三)
浏览器缓存
- Ubuntu开启或重启ssh服务
开启ssh服务首先需要安装打开ssh服务的库: sudo apt-get install openssh-server 检查当前的ssh开启情况: ps -e |grep ssh 如果有sshd,则s ...
- 如何征服面试官,拿到Offer [转]
转自 https://my.oschina.net/cccyb/blog/3012768 又到了茶余饭后的时间,想想写点什么,掐指一算,噢呦,快到3月份了,职场的金三银四跳槽季又来了,不同的是今年比往 ...