基于命令性代码的验证

基于命令性代码的验证为活动提供用于自身验证的简单方法,并且该方法可用于从 CodeActivityAsyncCodeActivityNativeActivity 派生的活动。 会向活动中添加确定所有验证错误或警告的验证代码。

使用基于代码的验证

CodeActivityAsyncCodeActivityNativeActivity 派生的活动支持基于代码的验证。 可以将验证代码放置在 CacheMetadata 重写中,并且可以将验证错误或警告添加到元数据自变量中。 在下面的示例中,如果 Cost 大于 Price,则会向元数据中添加一个验证错误。

注意

请注意,CostPrice 不是针对活动的自变量,而是在设计时设置的属性。 这就是为什么可以在 CacheMetadata 重写中验证其值的原因。 流过某一参数的数据值不能在设计时验证,因为在运行时之前数据不流动,但可以对活动参数进行验证,以便确保通过使用 RequiredArgument 特性和重载组对它们进行限定。 此示例代码查看 Description 自变量的 RequiredArgument 特性,如果未绑定,则会生成验证错误。 必需自变量和重载组中介绍了必需的自变量。

public sealed class CreateProduct : CodeActivity  
{  
    public double Price { get; set; }  
    public double Cost { get; set; }  
  
    // [RequiredArgument] attribute will generate a validation error
    // if the Description argument is not set.  
    [RequiredArgument]  
    public InArgument<string> Description { get; set; }  
  
    protected override void CacheMetadata(CodeActivityMetadata metadata)  
    {  
        base.CacheMetadata(metadata);  
        // Determine when the activity has been configured in an invalid way.  
        if (this.Cost > this.Price)  
        {  
            // Add a validation error with a custom message.  
            metadata.AddValidationError("The Cost must be less than or equal to the Price.");  
        }  
    }  
  
    protected override void Execute(CodeActivityContext context)  
    {  
        // Not needed for the sample.  
    }  
}  

默认情况下,调用 AddValidationError 时会向元数据中添加一个验证错误。 若要添加验证警告,请使用接受 AddValidationErrorValidationError 重载,并通过设置 ValidationError 属性来指定 IsWarning 表示一个警告。

当在工作流设计器中修改工作流,并且工作流设计器中显示任何验证错误或警告时,将执行验证。 此外,当调用工作流时,如果发生任何验证错误,默认验证逻辑将引发 InvalidWorkflowException,此时,也将在运行时执行验证。 有关调用验证和访问任何验证警告或错误的详细信息,请参阅调用活动验证

CacheMetadata 引发的任何异常不会视为验证错误。 这些异常将从对 Validate 的调用中转义,并且必须由调用方进行处理。

基于代码的验证对于验证包含代码的活动非常有用,但它看不到工作流中的其他活动。 声明性约束验证能够验证某个活动与工作流中其他活动之间的关系,在声明性约束主题中对此进行了介绍。