基于命令性代码的验证
基于命令性代码的验证为活动提供用于自身验证的简单方法,并且该方法可用于从 CodeActivity、AsyncCodeActivity 和 NativeActivity 派生的活动。 会向活动中添加确定所有验证错误或警告的验证代码。
使用基于代码的验证
从 CodeActivity、AsyncCodeActivity 和 NativeActivity 派生的活动支持基于代码的验证。 可以将验证代码放置在 CacheMetadata 重写中,并且可以将验证错误或警告添加到元数据自变量中。 在下面的示例中,如果 Cost
大于 Price
,则会向元数据中添加一个验证错误。
注意
请注意,Cost
和 Price
不是针对活动的自变量,而是在设计时设置的属性。 这就是为什么可以在 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 时会向元数据中添加一个验证错误。 若要添加验证警告,请使用接受 AddValidationError 的 ValidationError 重载,并通过设置 ValidationError 属性来指定 IsWarning 表示一个警告。
当在工作流设计器中修改工作流,并且工作流设计器中显示任何验证错误或警告时,将执行验证。 此外,当调用工作流时,如果发生任何验证错误,默认验证逻辑将引发 InvalidWorkflowException,此时,也将在运行时执行验证。 有关调用验证和访问任何验证警告或错误的详细信息,请参阅调用活动验证。
由 CacheMetadata 引发的任何异常不会视为验证错误。 这些异常将从对 Validate 的调用中转义,并且必须由调用方进行处理。
基于代码的验证对于验证包含代码的活动非常有用,但它看不到工作流中的其他活动。 声明性约束验证能够验证某个活动与工作流中其他活动之间的关系,在声明性约束主题中对此进行了介绍。