验证方式,   通过继承 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. Navi.Soft30.产品.代码生成器.操作手册

    1系统简介 1.1功能简述 在Net软件开发过程中,大部分时间都是在编写代码,并且都是重复和冗杂的代码.比如:要实现在数据库中10个表的增删改查功能,大部分代码都是相同的,只需修改10%的代码量.此时 ...

  2. CGI、FastCGI 知识总结

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  3. FFrpc python客户端lib

    摘要: Ffrpc可以很方便的构建c++ server, 在网游服务器程序开发中,进程间通讯非常的重要,比如gateserver和gameserver或dbserver之间的通信.而ffrpc可以使得 ...

  4. 【书单】book list

    正在看: [泡沫经济学].(日)野口悠纪雄 数学模型--姜启源 R in action Programming with R Scrapy Parallel R     准备看: Advanced.A ...

  5. IT Operations(IT 运营),运维的更价值化认识

    一直想努力向别人(甚至包括从事运维的人)解释清楚什么是运维,发现很难! 6月20号,在InfoQ高效运维群里面,对运维创业做了一次激烈的讨论,很自然地,过程中不可避免的谈到运维苦逼和运维无法产品化的问 ...

  6. KPI绩效考核为何在国内不管用?

    很多外国很好的管理制度,到了中国都有水土不服,就像KPI绩效考核一样,到了中国执行得很不好,甚至还不如用本土的人治管理方法,那是为何呢?为什么国内学平衡计分法和KPI的热情非常高,效果却往往有限? 其 ...

  7. Linux(Centos)下jdbc连接oracle速度超慢的问题

    最近在centos下写个java swing程序,发现在linux用jdbc连接oracle及其缓慢,还经常失败.但是同样的程序在windows下运行就连接的非常快.网上搜索了很长时间都和我这情况没关 ...

  8. IIS7.5配置SSL

    1,首先需要准备两个证书(CA证书,服务器证书). CA证书由公共的CA机构提供,widnow系统内部已经内置了很多这类证书,如图(日文系统). 服务器证书是导入到IIS里面用的. 2,有了上面的认识 ...

  9. Selenium WebDriver屏幕截图(C#版)

    Selenium WebDriver屏幕截图(C#版)http://www.automationqa.com/forum.php?mod=viewthread&tid=3595&fro ...

  10. IPv4分析

    IPv4的头部格式: 1. Version 版本号,默认是4. 2. IHL(Internet Header Length) 就是IPv4头部长度.这个长度的单位是32bit,一般是5,那么头部的长度 ...