惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

MyScale Blog
MyScale Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
阮一峰的网络日志
阮一峰的网络日志
罗磊的独立博客
博客园 - 叶小钗
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
美团技术团队
酷 壳 – CoolShell
酷 壳 – CoolShell
雷峰网
雷峰网
宝玉的分享
宝玉的分享
大猫的无限游戏
大猫的无限游戏
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Last Week in AI
Last Week in AI
爱范儿
爱范儿
小众软件
小众软件
K
Kaspersky official blog
P
Proofpoint News Feed
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - Franky
V
Vulnerabilities – Threatpost
博客园_首页
Microsoft Security Blog
Microsoft Security Blog
C
Cybersecurity and Infrastructure Security Agency CISA
V
V2EX
C
Check Point Blog
S
Schneier on Security
P
Palo Alto Networks Blog
IT之家
IT之家
GbyAI
GbyAI
T
Threat Research - Cisco Blogs
Hugging Face - Blog
Hugging Face - Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Apple Machine Learning Research
Apple Machine Learning Research
C
Cyber Attacks, Cyber Crime and Cyber Security
T
Tailwind CSS Blog
Project Zero
Project Zero
Y
Y Combinator Blog
V
Visual Studio Blog
Simon Willison's Weblog
Simon Willison's Weblog
T
Threatpost
Scott Helme
Scott Helme
L
LINUX DO - 热门话题
S
Securelist
C
CERT Recently Published Vulnerability Notes
A
Arctic Wolf
M
MIT News - Artificial intelligence
人人都是产品经理
人人都是产品经理

博客园 - Young.Jiang

Iframe的高级操作 Javascript模拟c#方法重载 设计模式学习:适配器模式 Linq学习笔记(2.3)——DLinq高级操作 Linq学习笔记(2.2)——深入DLinq查询 Linq学习笔记(2.1)——初识 DLinq Linq学习笔记(1.8)——Count、Sum、Min、Max、Average Linq学习笔记(1.7)——First、ElementAt、Any、all Linq学习笔记(1.6)——ToArray、ToList、ToDictionary、OfType Linq学习笔记(1.5)——group、Distinct、Union、Concat、Intersect、Except Linq学习笔记(1.4)——orderby、Reverse() Linq学习笔记(1.3)——Take、Skip Linq学习笔记(1.2)——select Linq学习笔记(1.1)——where 理解JavaScript中的对象 Asp.net Ajax 客户端编程(二)——Type 类,面向对象编程的开始 Asp.net Ajax 客户端编程(一)——对JS基本类型的扩展 提高.NET性能的最佳实践 EnterpriseLibrary 3.0的缓存应用程序块
EnterpriseLibrary 3.0的验证应用程序块
Young.Jiang · 2007-05-09 · via 博客园 - Young.Jiang

EnterpriseLibrary 3.0的验证应用程序块,可以为系统开发提供统一的验证方法,并且和其他程序块一样操作简单,非常实用。

1,使整个程序维持统一的验证风格;
2,验证对象必须是标准的.net数据类型;
3,允许通过配置文件,特性,代码来创建规则;
4,允许对同一个验证对象设置多个验证规则。

先给大家举个具体操作的例子:

1;向系统添加引用:

Microsoft.Practices.EnterpriseLibrary.Validation.dll;
Microsoft.Practices.EnterpriseLibrary.ObjectBuilder.dll

2;根据您的程序类型在下面3个中选择添加引用;

Microsoft.Practices.EnterpriseLibrary.Validation.Integration.WinForms.dll ;
Microsoft.Practices.EnterpriseLibrary.Validation.Integration.AspNet.dll ;
Microsoft.Practices.EnterpriseLibrary.Validation.Integration.WCF.dll ;

3在你的c#代码中使用

using Microsoft.Practices.EnterpriseLibrary.Validation;
using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;

4,编写代码

public class Employee
    
{
        
private string _name;
        
private string _email;

        [StringLengthValidator(
012)]         //该属性的字符串长度为0-12;
        public string name
        
{
            
get return _name; }
            
set this._name = value; }
        }


        [RegexValidator(
@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*")] //该属性满足此表达式;
        public string email
        
{
            
get return _email; }
            
set this._email = value; }
        }

    }


    
public partial class _Default : System.Web.UI.Page                  //实际运用
    {
        
protected void Page_Load(object sender, EventArgs e)
        
{
            Employee employee 
= new Employee();
            employee.name 
= "my name is Young.Jiang";
            employee.email 
= "Young18.J#gmail.com";
            ValidationResults vrs 
= Validation.Validate<Employee>(employee);       //对employee对象进行验证,返回验证结果。
            if (!vrs.IsValid)
            
{
                
foreach (ValidationResult vr in vrs)
                
{
                    Response.Write(
string.Format("错误位置:{0};原因:{1}<br>", vr.Key, vr.Message));
                }

            }

        }

    }

最终显示的结果是:
错误位置:name;原因:The length of the value must fall within the range "0" (Inclusive) - "12" (Inclusive).
错误位置:email;原因:The value must match the regular expression "\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" with options "None".
上例中RegexValidator,StringLengthValidator都是validator中的一种验证类型,除此之外validator还有多种验证类型,下面我们来看看如何通过特性和代码来编写验证规则及如何通过 Tag 和 MessageTemplate来关联验证对象。

ContainsCharactersValidator:验证对象是否包含某些特定字符
        属性:CharacterSet:要验证的字符,可以是多个字符组成的字符串;
        ContainsCharacters:有any和all两种,any表示如果CharacterSet中某个字符匹配就满足匹配规则,all表示必须完全匹配;

DateTimeRangeValidator       时间范围验证

DomainValidator        域验证,为验证对象设置指定清单
           eg. [DomainValidator("young", "jiang", "yang")] :验证对象必须是上述列举字符串的一种

EnumConversionValidator       枚举验证
        参数:EnumType
        eg.    enum Sex        {female,male}
              [EnumConversionValidator(typeof(Sex))]

NotNullValidator       非空验证
ObjectValidator       对象验证,将提到的验证器作用与一个对象,如果对象为空,将忽略所有验证,

ObjectCollectionValidator 对象集合验证,参数为指定的集合类型
        eg. [ObjectCollectionValidator(typeof(sex)]

PropertyComparisonValidator       比较验证
        参数:1)比较因子(另一个属性)       2)比较名称 ComparisonOperator,一个枚举
        [PropertyComparisonValidator("MinimumBid", ComparisonOperator.GreaterThanEqual)]
要验证对象必须大于等于MinimumBid属性

RangeValidator       范围验证
eg. [RangeValidator(0, RangeBoundaryType.Inclusive, 110,RangeBoundaryType.Inclusive)]
        验证在0-110之间,包括0和110

RegexValidator       正则验证

RelativeDateTimeValidator       时间范围验证,
我理解与DateTimeRangeValidator的区别是,DateTimeRangeValidator指定具体的时间范围,         RelativeDateTimeValidator与验证对象相关的一个时间范围。
eg.[RelativeDateTimeValidator(-120, DateTimeUnit.Year, -18, DateTimeUnit.Year)]

StringLengthValidator        字符串长度验证

TypeConversionValidator 转换验证
eg.   [TypeConversionValidator(typeof(double))]       验证对象需能转换为double型

AndCompositeValidator        and验证       几种验证规则必须全部满足
eg.   [ValidatorComposition(CompositionType.And)]
      [NotNullValidator]
      [StringLengthValidator(10)]
      验证对象必须同时满足NotNullValidator验证和StringLengthValidator验证

OrCompositeValidator        or验证,满足几种验证规则之一即满足验证,可与AndCompositeValidator比较学习

上面列举的所有验证都有一些公共属性来定制验证结果。
MessageTemplate:验证失败后,返回的错误信息。
MessageTemplateResourceName 与 MessageTemplateResourceType从指定模板清单中选择一种模板的名称和类型
Negate:验证取反,bool型,默认为false,不取反
eg. [StringLengthValidator(0,12)]表示验证对象长度在0-12之间,如果在加上Negate=true,表示验证对象长度在0-12之间,则验证失。
Tag :对验证对象分类
Ruleset:为一组规则命名。

实用Self Validation来进行内部验证
用HasSelfValidation 标志需要内部验证的类,实用SelfValidation标注类中需要验证的方法。

[HasSelfValidation]
public class Address
{
       
private string _zipCode;
       [StringLengthValidator(
1,10)]
       
public string ZipCode
       
{
           
get return _zipCode; }
           
set { _zipCode = value; }
       }

       [SelfValidation]
       
public void DoValidate(ValidationResults results)
       
{
           ValidationResult result1 
= new ValidationResult("Error Message"typeof(Address), "",""null);
           results.AddResult(result1);
       }

}

在实际程序中根据设置的特性来对对象进行验证

Customer customer = new Customer();
ValidationResults results 
= Validation.Validate<Customer>(customer, customerRuleSetCombo.Text);

页可以实用下面代码

Customer customer = new Customer();
Validator
<Customer> validator = ValidationFactory.CreateValidator<Customer>(customerRuleSetCombo.Text);
ValidationResults results 
= validator.Validate(customer);

在asp.net中实用PropertyProxyValidator进行验证

<asp:TextBox ID="firstNameTextBox" runat="server"></asp:TextBox>
<cc1:propertyproxyvalidator id="firstNameValidator"       runat="server"
          ControlToValidate
="firstNameTextBox"
          PropertyName
="FirstName"
          RulesetName
="RuleSetA" 
          SourceTypeName
="ValidationQuickStart.BusinessEntities.Customer">
</cc1:propertyproxyvalidator>


创建型验证规则

Validator<string> emailAddressValidator = new RegExValidator(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*");

使用RegExValidator来创建一个新验证器emailAddressValidator

Validator shortStringValidator = new AndCompositeValidator(
                                        
new NotNullValidator(),
                                        
new StringLengthValidator(15));


验证规则继承

Public Class Customer
{
         [CustomerNameValidator]
         
public string Name
         
{
             
get{/* ... */} 
             
set{/* ... */}
         }


         [DiscountValidator]
         
public virtual double Discount
         
{
             
get/* ... */} 
             
set{/* ... */}
         }

}

public class PreferredCustomer : Customer
{
         [PreferredDiscountValidator]
         
public override double Discount
         
{
             
get{/* ...*/}
             
set/*... */}
         }

}

在上面例子中,PreferredCustomer 继承Customer类,也继承了[CustomerNameValidator]验证规则,但用[PreferredDiscountValidator]取代了 [DiscountValidator]验证规则