• 微软企业库5.0学习笔记实战数据验证模块高级篇


    1、添加自定义的提示信息

      验证失败的提示信息可以自定义,企业库的验证模块也提供了自定义的功能。是通过读取资源文件的设置来实现的。首先添加资源文件,在项目的右键菜单中选择【属性】,然后点击【资源】添加文件并且定义三个字符串类型的资源。

      

      

      在上一章中的Customer类的attribute上多添加一些参数,引入资源的命名空间,具体如下所示,就是指明要用的资源名称和类型。

      

    代码
    public class Customer 

        [StringLengthValidator(
    125
            MessageTemplateResourceType 
    = typeof(Resources), 
            MessageTemplateResourceName 
    = "FirstNameMessage")] 
        
    public string FirstName { getset; } 
        [StringLengthValidator(
    125
            MessageTemplateResourceType 
    = typeof(Resources), 
            MessageTemplateResourceName 
    = "LastNameMessage")] 
        
    public string LastName { getset; } 
        [RegexValidator(
    @"^\d\d\d-\d\d-\d\d\d\d$"
            MessageTemplateResourceType 
    = typeof(Resources), 
            MessageTemplateResourceName 
    = "SSNMessage")] 
        
    public string SSN { getset; } 
        [ObjectValidator] 
        
    public Address Address { getset; } 

      继续运行程序,就会发现提示信息变成了自定义的内容。

      2、实现自己验证

      首先在Customer类上添加[HasSelfValidation] 特性(attribute),然后为自验证添加一个方法,参数是ValidationResults .

      

    代码
    using System;
    using System.Text.RegularExpressions;
    using Microsoft.Practices.EnterpriseLibrary.Validation;
    using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;

    namespace ValidationHOL.BusinessLogic
    {
        [HasSelfValidation]
        
    public class Customer
        {
            
    public string FirstName { getset; }
            
    public string LastName { getset; }
            
    public string SSN { getset; }
            
    public Address Address { getset; }

            
    static Regex ssnCaptureRegex =
                
    new Regex(@"^(?<area>\d{3})-(?<group>\d{2})-(?<serial>\d{4})$");

            [SelfValidation]
            
    public void ValidateSSN(ValidationResults validationResults)
            {
                
    // validation logic according to 
                
    // http://ssa-custhelp.ssa.gov/cgi-bin/ssa.cfg/php/enduser/std_adp.php?p_faqid=425

                Match match 
    = ssnCaptureRegex.Match(this.SSN);
                
    if (match.Success)
                {
                    
    string area = match.Groups["area"].Value;
                    
    string group = match.Groups["group"].Value;
                    
    string serial = match.Groups["serial"].Value;

                    
    if (area == "666"
                        
    || string.Compare(area, "772", StringComparison.Ordinal) > 0)
                    {
                        validationResults.AddResult(
                            
    new ValidationResult(
                                
    "Invalid area",
                                
    this,
                                
    "SSN",
                                
    null,
                                
    null));
                    }
                    
    else if (area == "000" || group == "00" || serial == "0000")
                    {
                        validationResults.AddResult(
                            
    new ValidationResult(
                                
    "SSN elements cannot be all '0'",
                                
    this,
                                
    "SSN",
                                
    null,
                                
    null));
                    }
                }
                
    else
                {
                    validationResults.AddResult(
                        
    new ValidationResult(
                            
    "Must match the pattern '###-##-####'",
                            
    this,
                            
    "SSN",
                            
    null,
                            
    null));
                }
            }
        }
    }

      3、自定义验证

      继承Validator类,重写里面的方法DoValidate 即可。

      

    代码
     public class SSNValidator : Validator<string>
        {
            
    public SSNValidator(string tag)
                : 
    this(tag, false)
            {
            }

            
    public SSNValidator(string tag, bool ignoreHypens)
                : 
    base(string.Empty, tag)
            {
                
    this.ignoreHypens = ignoreHypens;
            }

            
    static Regex ssnCaptureRegex =
                
    new Regex(@"^(?<area>\d{3})-(?<group>\d{2})-(?<serial>\d{4})$");
            
    static Regex ssnCaptureNoHypensRegex =
                
    new Regex(@"^(?<area>\d{3})(?<group>\d{2})(?<serial>\d{4})$");
            
    private bool ignoreHypens;

            
    protected override string DefaultMessageTemplate
            {
                
    get { throw new NotImplementedException(); }
            }

            
    protected override void DoValidate(
                
    string objectToValidate,
                
    object currentTarget,
                
    string key,
                ValidationResults validationResults)
            {
                
    // validation logic according to 
                
    // http://ssa-custhelp.ssa.gov/cgi-bin/ssa.cfg/php/enduser/std_adp.php?p_faqid=425

                Match match 
    =
                    (ignoreHypens 
    ? ssnCaptureNoHypensRegex : ssnCaptureRegex)
                        .Match(objectToValidate);
                
    if (match.Success)
                {
                    
    string area = match.Groups["area"].Value;
                    
    string group = match.Groups["group"].Value;
                    
    string serial = match.Groups["serial"].Value;

                    
    if (area == "666"
                        
    || string.Compare(area, "772", StringComparison.Ordinal) > 0)
                    {
                        LogValidationResult(
                            validationResults,
                            
    "Invalid area",
                            currentTarget,
                            key);
                    }
                    
    else if (area == "000" || group == "00" || serial == "0000")
                    {
                        LogValidationResult(
                            validationResults,
                            
    "SSN elements cannot be all '0'",
                            currentTarget,
                            key);
                    }
                }
                
    else
                {
                    LogValidationResult(
                        validationResults,
                        
    this.ignoreHypens
                            
    ? "Must be 9 digits"
                            : 
    "Must match the pattern '###-##-####'",
                        currentTarget,
                        key);
                }
            }
        }

      继承ValidatorAttribute ,实现一个自定义验证的attribute。

      

    代码
     public class SSNValidatorAttribute : ValidatorAttribute
        {
            
    protected override Validator DoCreateValidator(Type targetType)
            {
                
    return new SSNValidator(this.Tag);
            }
        }

      在属性上添加自定义验证的attribute  

     

      [SSNValidator] 
      
    public string SSN { getset; } 

      4、 通过配置实现自定义的验证

      首先还是要编写自定义的验证类和attribute,然后在配置中添加自定义自定义验证的时候,选择自定义验证类对应的程序集,进而选择程序集中的自定义验证类就可以了。

      

    【Blog】http://virusswb.cnblogs.com/

    【MSN】jorden008@hotmail.com

    【说明】转载请标明出处,谢谢

  • 相关阅读:
    图的概述
    "《算法导论》之‘排序’":线性时间排序
    “《算法导论》之‘查找’”:散列表
    如何使用VS2013本地C++单元测试框架
    “《算法导论》之‘查找’”:顺序查找和二分查找
    查找算法概述
    第二部分 位运算符、赋值运算符、三元及一元运算符和语句分类
    LINQ 的查询_联表、分组、排序
    第二部分 关系与比较运算符 、 自增与自减运算符、条件逻辑运算符
    LINQ to Sql系列一 增,删,改
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/1765039.html
Copyright © 2020-2023  润新知