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
相关产品推荐
相关产品推荐

