You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Workflow Foundation自定义活动实现CheckIn为真时关联参数动态必填验证

Workflow Foundation 自定义活动条件参数验证实现方案

你可以通过以下两种方式实现需求,推荐优先使用第一种方案,可同时覆盖设计时与运行时验证场景:

方案1:重写CacheMetadata方法(推荐)

WF的活动验证逻辑默认在CacheMetadata生命周期阶段执行,重写该方法可以实现设计器实时提示+运行时校验的双重效果,代码修改如下:

public sealed class File_Upload : CodeActivity
{
    [Category("Input")]
    [DisplayName("Location of file to upload")]
    [RequiredArgument]
    public InArgument<string> File_Location { get; set; }

    [Category("Input")]
    [DisplayName("Check in file?")]
    [RequiredArgument]
    public InArgument<bool> CheckIn { get; set; }

    [Category("Input")]
    [DisplayName("Check in comment")]
    //Required if CheckIn == True
    public InArgument<string> CheckInComment { get; set; }

    [Category("Input")]
    [DisplayName("Check in type")]
    //Required if CheckIn == True
    public InArgument<CheckinType> chekintype { get; set; }

    protected override void CacheMetadata(CodeActivityMetadata metadata)
    {
        base.CacheMetadata(metadata);
        
        // 仅当CheckIn设置为常量true时做设计时校验
        if (CheckIn.Expression is Literal<bool> checkInLiteral && checkInLiteral.Value)
        {
            if (CheckInComment == null)
            {
                metadata.AddValidationError("当CheckIn设置为True时,CheckInComment为必填项");
            }
            if (chekintype == null)
            {
                metadata.AddValidationError("当CheckIn设置为True时,Check in type为必填项");
            }
        }
    }

    protected override void Execute(CodeActivityContext context)
    {
        // 运行时动态校验,覆盖CheckIn值为动态绑定的场景
        bool isCheckIn = CheckIn.Get(context);
        if (isCheckIn)
        {
            if (string.IsNullOrWhiteSpace(CheckInComment.Get(context)))
            {
                throw new ArgumentNullException(nameof(CheckInComment), "签入时必须填写签入备注");
            }
            if (chekintype.Get(context) == default)
            {
                throw new ArgumentNullException(nameof(chekintype), "签入时必须选择签入类型");
            }
        }
        // 原有业务逻辑
    }
}

方案2:仅在Execute方法中做运行时验证

如果不需要设计时提示,也可以只在执行逻辑开头加入校验,代码更简洁,仅在活动运行时触发校验:

protected override void Execute(CodeActivityContext context)
{
    bool needCheckIn = CheckIn.Get(context);
    if (needCheckIn)
    {
        var comment = CheckInComment.Get(context);
        if (string.IsNullOrEmpty(comment))
            throw new ArgumentException("签入时必须提供CheckInComment参数", nameof(CheckInComment));
        
        var type = chekintype.Get(context);
        if (type == default(CheckinType))
            throw new ArgumentException("签入时必须提供chekintype参数", nameof(chekintype));
    }

    // 原有业务代码
}

小提示:你当前的属性名chekintype存在拼写错误,建议修正为checkintype避免后续调用时出错。

内容的提问来源于stack exchange,提问作者Conor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 15:45:04