7

我不清楚何时以及如何在 WF 4.0 中的自定义活动/自定义活动工厂/自定义设计器中进行验证。

我的活动中唯一似乎提供验证错误支持的地方是在CacheMetadata方法中(我相信在设计过程中会多次调用它)。这是我应该进行验证的地方吗?ActivityDesigner 中是否支持验证?

4

2 回答 2

4

是的,您的活动中的 CacheMetadata 是您应该进行验证的地方。验证是一个适用于工作流运行时以及设计器的概念。(您可以从以下事实中看出这一点:您仍然可以尝试运行具有验证错误的已编译或声明式工作流,但这样做时会引发异常。)

例子:

protected override void CacheMetadata(ActivityMetadata metadata)
{
   if (this.Body == 0) metadata.AddValidationError(
     new ValidationError(
       "You forgot to supply a body for (this activity)",
       /*iswarning = */ true, 
       "Body"));
}

(参见ActivityMetadata.AddValidationError

您的第二个问题是是否支持从 ActivityDesigner 端添加验证?答案是“不,不是真的”——可以做一些自定义 WPF 和数据绑定,在 ActivityDesigner 之上添加一些“自定义验证”,甚至可以使用 AttachedPropertiesService 在您的活动类上定义您自己的 SatisfiesConstraints 属性. 但这是额外的工作,并且不会始终与运行时验证相关联,因此这是一个价值有限的想法。

于 2009-12-19T05:25:21.133 回答
-1
public class SalesCommissionValidation : CodeActivity<decimal>
{
    public decimal NetSales { get; set; }
    public decimal Percentage { get; set; }

    protected override decimal Execute(CodeActivityContext context)
    {
        var commission = NetSales * (Percentage / 100);
        return commission;
    }

    protected override void CacheMetadata(CodeActivityMetadata metadata)
    {
        base.CacheMetadata(metadata);

        if (NetSales <= 0)
            metadata.AddValidationError("Sales cannot be less than 0!");
        else if (Percentage <= 0)
            metadata.AddValidationError("Sales percentgage cannot be less than 0!");
        else
        {
            if (Percentage > 20)
                metadata.AddValidationError(string.Format("Sales percentgage {0} cannot be greater than 20%", Percentage));
        }

    }
}
于 2014-09-23T16:45:11.717 回答