验证方式,   通过继承 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. C#中操作xml文件(插入节点、修改、删除)

    已知有一个xml文件(bookstore.xml)如下: <?xml version="1.0" encoding="gb2312"?> <b ...

  2. Redrain个人维护并使用的DuiLib和UiLib库源代码下载地址

    转载请说明原出处:http://blog.csdn.net/zhuhongshu/article/details/40740353,谢谢~~ 首先说明一下Duilib和Uilib的差别:UiLIb是D ...

  3. 【转】 IOS开发xcode报错之has been modified since the precompiled header was built

    本文转载自  IOS开发xcode报错之has been modified since the precompiled header was built 其实我是升级xcode到4.6.3的时候遇到的 ...

  4. CLR VIA

     标题  状态  内容 什么是CLR? 什么是托管模块? 托管模块由什么组成? .net代码的执行过程   http://www.cnblogs.com/aaa6818162/p/4726581.ht ...

  5. MassTransit_契约的创建

    消息契约的命名规范 命令模式:动词+对象 事件模式:对象+动词 不同模式下要求不同的主键 Creating a message contract In MassTransit, a message c ...

  6. Windows下Git安装指南

    参考<Git权威指南>安装整理,图书配套网址参见[1] 1. Cygwin下安装配置Git 1. 在Windows下安装配置Git有2种不同的方案 (1)msysGit, (2)Cygwi ...

  7. MFC一个类访问另一个类成员对象的成员变量值

    MFC中一个类要访问另外一个类的的对象的成员变量值,这就需要获得原来那个类对象的指针,其实有好几种方法都可以实现. 比如维护一个单例模式.设置静态变量等等.我们这里举个列子,实现多个类之间的相互访问. ...

  8. 多线程锁--怎么理解Condition

    在java.util.concurrent包中,有两个很特殊的工具类,Condition和ReentrantLock,使用过的人都知道,ReentrantLock(重入锁)是jdk的concurren ...

  9. WebDriver基本API使用手册(基于Java和C#)

    WebDriver基本API使用手册(基于Java和C#) http://www.docin.com/p-747728551.html

  10. 关于app.config不能即时保存读取的解决方案

    public void saveValue(string Name, string Value) { ConfigurationManager.AppSettings.Set(Name, Value) ...