代码改变世界

Windows Workflow HOL学习笔记(七):添加一个验证来检查Email参数

2007-05-21 11:06  努力学习的小熊  阅读(1048)  评论(0编辑  收藏  举报

本文内容来自Microsoft Hands-on Labs for Windows Workflow Foundation中的HOL02中的第三个练习,其中包括两个任务:

添加一个验证来检查Email参数。

Ø         添加一个Email验证的Code Activity

Ø         测试这个验证

 

这个练习中,将扩展练习2中的项目,验证发送邮件地址的属性内容Email格式是否正确。

Designer:这个组件定义了workflow中的activitycustom activity设计的直观表示。

Code generator:这是一个扩展,用来生成工作流中activity的自定义代码。InvokeWebService这个开箱即用的activity就是这样。

Validator:这个组件增强了设计时和运行时的activity符号。

Toolbox item:定义了activityVisual Studio的设计环境中,在工具箱中显示的自定义行为。

Executor:这是一个无状态的组件,用来执行activityexecution semantics。这个组件不会在简单的情况下定义,例如前面一个练习的情况下才会被覆写。

Serializer:如果需要提供自定义的序列化行为。

Deployer:当工作流包含activity,运行代码时将部署到主环境中。

 

1.在解决方案资源管理器中,在SendMailActivityLibrary中添加一个Code File,名字为ParametersValidator.cs

2.添加如下代码来建立适当的继承关系。ActivityValidator类包含设计时和运行时的验证逻辑来确保activity被适当的配置。自定义的验证类继承自ActivityValidator还是CompositeActivityValidator基类,依赖于你的activity是一个基本的还是一个复合的。在工作流编译的时候和运行时,当activity动态更新执行时自动执行验证。

using System;

using System.Collections.Generic;

using System.Text;

using System.Workflow.Activities;

using System.Workflow.ComponentModel;

using System.Workflow.ComponentModel.Compiler;

using System.Text.RegularExpressions;

using System.Net.Mail;

 

namespace SendMailActivityLibrary

{

    public class ParametersValidator : ActivityValidator

    {

    }

}

3.覆写ValidateProperties方法,这样我们可以在自定属性上执行自定义验证。ActivityValidateProperties方法主要用来校验Activity属性的编译语法。这个验证组件将检查Email地址是否为正确的格式。

        public override ValidationErrorCollection ValidateProperties(ValidationManager manager, object obj)

        {

            ValidationErrorCollection validationErrors = new ValidationErrorCollection(base.ValidateProperties(manager, obj));

 

            SendMailActivity sendMailActivityToBeValidated = obj as SendMailActivity;

 

            if (sendMailActivityToBeValidated == null)

            {

                throw new InvalidOperationException("Parameter obj is not of type SendMailActivity");

            }

 

            if (!IsValidEmailAddress(sendMailActivityToBeValidated.To))

            {

                ValidationError CustomActivityValidationError = new ValidationError(String.Format("\'{0}\' is an Invalid destination e-mail address", sendMailActivityToBeValidated.To), 1);

 

                validationErrors.Add(CustomActivityValidationError);

            }

 

            if (!IsValidEmailAddress(sendMailActivityToBeValidated.From))

            {

                ValidationError CustomActivityValidationError = new ValidationError(String.Format("\'{0}\' is an Invalid source e-mail address", sendMailActivityToBeValidated.From), 1);

 

                validationErrors.Add(CustomActivityValidationError);

            }

 

            return validationErrors;

        }

4.你会注意到里面调用了一个方法叫IsValidEmailAddress。这是验证部分的引擎,它检查字符串是否为一个有效的Email地址。

        public Boolean IsValidEmailAddress(string address)

        {

            // must only proceed with validation if we have data   

            // to validate

            if (address == null || address.Length == 0)

                return true;

 

            Regex rx = new Regex(@"[^A-Za-z0-9@\-_.]", RegexOptions.Compiled);

            MatchCollection matches = rx.Matches(address);

 

            if (matches.Count > 0)

                return false;

 

            // Must have an '@' character

            int i = address.IndexOf('@');

 

            // Must be at least three chars after the @

            if (i <= 0 || i >= address.Length - 3)

                return false;

 

            // Must only be one '@' character

            if (address.IndexOf('@', i + 1) >= 0)

                return false;

 

            // Find the last . in the address

            int j = address.LastIndexOf('.');

 

            // The dot can't be before or immediately after the @ char

            if (j >= 0 && j <= i + 1)

                return false;

 

            return true;

        }

5.查看SendMailActivity代码。把ActivityValidator加到SendMailActivity上。

    [ActivityValidator(typeof(ParametersValidator))]

    public partial class SendMailActivity : System.Workflow.ComponentModel.Activity

6.生成解决方案。

任务一完成。

 

7.打开SendMailWorkflow设计视图。选中SendMailActivity。在From属性中输入一个不正确的Email地址。

8.在设计视图上,SendMailActivity右上角会出现一个红色的叹号,将鼠标放在上面会看到验证后的错误提示。
   

9.修改后,Email地址验证通过,错误提示会消失。

10.保存文件,编译生成解决方案。

任务二完成。

参考资料:

Microsoft Hands-on Labs for Windows Workflow Foundation