验证方式,   通过继承 IDataErrorInfo接口 和 DataAnnotations 解释标记语言而实现,

为了能在WPF上通用,所了也要继承属性更改通知接口INotifyPropertyChanged

实际INotifyPropertyChanged接口

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel; namespace ClassLibrary1
{
public class NotifyPropertyChanged : INotifyPropertyChanged
{
#region INotifyPropertyChanged Members
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
} public event PropertyChangedEventHandler PropertyChanged;
#endregion
}
}

验证核心类   继承 IDataErrorInfo和INotifyPropertyChanged的实现类

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Reflection; namespace ClassLibrary1
{
/// <summary>
/// 验证类和更改通知类
/// System.ComponentModel.DataAnnotations;
/// </summary>
/// <typeparam name="T"></typeparam>
public abstract class ValidationEntity<T> : NotifyPropertyChanged,IDataErrorInfo
{
public string Error
{
get { return null; }
} public string this[string columnName]
{
get
{
return ValidateProperty(columnName);
}
} /// <summary>
/// 验证是否通过
/// </summary>
/// <param name="errors">错误信息 ErrorMessage 值提取</param>
/// <returns></returns>
public bool Valid(ref Dictionary<string, string> errors)
{
bool result = true;
Type t = this.GetType();
PropertyInfo[] PropertyInfo = t.GetProperties();
try
{
foreach (PropertyInfo pi in PropertyInfo)
{
string name = pi.Name;
if (name == "Error" || name=="Item")
continue;
object value1 = pi.GetValue(this, null);
Dictionary<string, string> propertyErrors = new Dictionary<string, string>();
if (!IsPropertyValid(value1, name, ref propertyErrors))
{
result = false;
foreach (var item in propertyErrors)
{
if (!errors.ContainsKey(item.Key))
{
errors.Add(item.Key, item.Value);
}
}
}
}
}
catch (Exception ex)
{
string aaaa = ex.Message;
}
return result;
} /// <summary>
/// 验证属性值是否合格
/// </summary>
/// <param name="propertyName">属性名</param>
/// <returns></returns>
private string ValidateProperty(string propertyName)
{
if (string.IsNullOrEmpty(propertyName))
return string.Empty;
object obj = this;
var targetType = obj.GetType();
if (targetType != typeof(T))
{
TypeDescriptor.AddProviderTransparent(
new AssociatedMetadataTypeTypeDescriptionProvider(targetType, typeof(T)), targetType);
}
var propertyValue = targetType.GetProperty(propertyName).GetValue(obj, null);
var validationContext = new ValidationContext(obj, null, null);
validationContext.MemberName = propertyName;
var validationResults = new List<ValidationResult>();
Validator.TryValidateProperty(propertyValue, validationContext, validationResults);
if (validationResults.Count > )
{
return validationResults.First().ErrorMessage;
}
return string.Empty;
} /// <summary>
/// 验证属性值
/// </summary>
/// <param name="propertyValue">属性值</param>
/// <param name="propertyName">属性名</param>
/// <param name="errors">错误信息</param>
/// <returns></returns>
private bool IsPropertyValid(object propertyValue, string propertyName, ref Dictionary<string, string> errors)
{
object obj = this;
TypeDescriptor.AddProviderTransparent(
new AssociatedMetadataTypeTypeDescriptionProvider(obj.GetType(), typeof(T)), obj.GetType());
var validationContext = new ValidationContext(obj, null, null);
validationContext.MemberName = propertyName;
var validationResults = new List<ValidationResult>();
Validator.TryValidateProperty(propertyValue, validationContext, validationResults);
if (validationResults.Count > && errors == null)
errors = new Dictionary<string, string>(validationResults.Count);
foreach (var validationResult in validationResults)
{
if (!errors.ContainsKey(validationResult.MemberNames.First()))
errors.Add(validationResult.MemberNames.First(), validationResult.ErrorMessage);
}
if (validationResults.Count > )
return false;
else
return true;
} /// <summary>
/// 辅助方法,把消息转成字符串
/// </summary>
/// <param name="errors">消息</param>
/// <returns></returns>
public string ErrorToString(Dictionary<string, string> errors)
{
if (errors == null || errors.Count == )
return "";
StringBuilder str = new StringBuilder();
foreach (var item in errors)
{
str.Append(item.Value);
str.Append(Environment.NewLine);
}
str.Remove(str.Length - , );
return str.ToString();
} }
}

下面是分别在mvc,wpf,winform下的使用实例

C# 通用验证类 支持 WPF,MVC,Winform的更多相关文章

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

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

  2. 做一个牛XX的身份证号验证类(支持15位和18位)

    原文:做一个牛XX的身份证号验证类(支持15位和18位) #region 是否合法的中国身份证号码 protected bool IsChineseID() { if (str.Length == 1 ...

  3. C#操作SqlServer MySql Oracle通用帮助类Db_Helper_DG(默认支持数据库读写分离、查询结果实体映射ORM)

    [前言] 作为一款成熟的面向对象高级编程语言,C#在ADO.Net的支持上已然是做的很成熟,我们可以方便地调用ADO.Net操作各类关系型数据库,在使用了多年的Sql_Helper_DG后,由于项目需 ...

  4. WPF与WinForm的抉择

    微软曾经对WPF(代号Avalon)抱很大的期望——新一代的华丽用户界面平台,一统Web应用和桌面应用,Flash杀手,尽管微软口头上不承认.几年下来,WPF确实实现了当初的预期的大部分功能,但离称霸 ...

  5. 通用窗口类 Inventory Pro 2.1.2 Demo1(下)

    本篇想总结的是Inventory Pro中通用窗口的具体实现,但还是要强调下该插件的重点还是装备系统而不是通用窗口系统,所以这里提到的通用窗口类其实是通用装备窗口类(其实该插件中也有非装备窗口比如No ...

  6. WPF与Winform的选择

    最近公司计划对ERP系统全面升级,现有的ERP是简单的bs架构系统打算改版成cs.平时如自己写一些工具,小应用都是用winform就足够.但是界面总是很难看,据了解WPF在这一方面会强一些.因为之前对 ...

  7. MVC 插件化框架支持原生MVC的Area和路由特性

    .NET MVC 插件化框架支持原生MVC的Area和路由特性 前面开放的源码只是简单的Plugin的实现,支持了插件的热插拔,最近晚上偶然想到,原生的MVC提供Areas和RouteAtrribut ...

  8. Mvc_后端通用验证

    namespace Web.Mvc.Extensions { #region 验证基类 /// <summary> /// 通用验证基类 /// </summary> publ ...

  9. CYQ.Data 支持WPF相关的数据控件绑定(2013-08-09)

    事件的结果 经过多天的思考及忙碌的开发及测试,CYQ.Data 终于在UI上全面支持WPF,至此,CYQ.Data 已经可以方便支持wpf的开发,同时,框架仍保留最低.net framework2.0 ...

随机推荐

  1. Lua截取utf-8编码的中英文混合字符串

    参考博客:UTF8字符串在lua的截取和字数统计[转载] 需求 按字面个数来截取子字符串 函数(字符串, 开始位置, 截取长度) utf8sub(,) = 好1世界哈 utf8sub(,) = 你好1 ...

  2. java 读取文件路径空格和中文的处理

    应用部署时,发生文件读取错误,发现是部署路径中含有空格的文件夹名,然后把应用服务器位置迁移了. 从网上找到如下方案:1, TestURL().class.getResource("" ...

  3. c#列举和迭代器

    列举 - Enumeration 迭代器是一个值序列(集合)上的一个只读且只向前移动的游标.迭代器要么实现了IEnumerator接口,要么实现了IEnumerator<T>接口. 从技术 ...

  4. PD16 Generate Datebase For Sql2008R2时报脚本错误“对象名sysproperties无效”

    PowerDesinger16创建数据库表到SQL2008R2时,执行报“对象名sysproperties无效”错误. 主要是在建模时我们对表.列增加了些说明注释,而Sql2005之后系统表syspr ...

  5. UDP"打洞"原理

    1. NAT分类 根据Stun协议(RFC3489),NAT大致分为下面四类 1) Full Cone 这种NAT内部的机器A连接过外网机器C后,NAT会打开一个端口.然后外网的任何发到这个打开的端口 ...

  6. SVN: bdb: BDB1538 Program version 5.3 doesn't match environment version 4.7

    Q:bdb: BDB1538 Program version 5.3 doesn't match environment version 4.7 A: svnadmin recover /var/wh ...

  7. 解决play-1.4.0在linux或mac下提示No such file or directory的问题

    问题原因:"play"脚本中有特殊符号. 解决方案:写脚本去掉即可. 代码:fixplay.py 放在play-1.4.0目录下执行.亲测在osx与ubuntu下均可用. with ...

  8. 关于Python的web框架

    uliwebhttp://git.oschina.net/limodou/uliweb uliweb 吸取了其他框架的经验,集成了orm.总的来说一般.这个安装后有个exe文件,命令行工具.不绿色.个 ...

  9. [转]两种Sigma-Delta ADC SNR仿真方法

    假设现有一组Sigma-Delta ADC输出序列,下面将介绍两种计算出相应SNR的方法.其中由cadence导出数据的CIW窗口命令为:ocPrint(?output "输出目录/输出文件 ...

  10. 彻底删除mysql方法

    首先,先在服务(开始——>控制面板——>管理工具——>服务)里停掉MySQL的服务.打开控制面板-添加删除程序,找到MySQL,卸载.或者用360安全卫士来卸载也行.也可以用mysq ...