Bot Framework中重复使用Adaptive Card触发Input.ChoiceSet ID冲突问题
解决方案
问题根因
微软Teams客户端会在单一会话生命周期内缓存所有已渲染Adaptive Card的输入控件ID,即便是重新加载的同结构新卡片,重复使用相同ID的输入控件也会触发冲突校验报错。
可行解决方案(按实现成本从低到高排序)
方案1:新增唯一卡片标识(无需修改控件ID,推荐)
在返回卡片的Activity的ChannelData中添加唯一的cardId字段,让客户端将每次发送的卡片判定为独立实例,不会复用之前的ID缓存,修改代码如下:
// 原有创建reply代码之后新增 reply.ChannelData = new { cardId = Guid.NewGuid().ToString() }; return await stepContext.PromptAsync(nameof(TextPrompt), new PromptOptions {Prompt = reply}, cancellationToken);
方案2:动态生成控件唯一ID
如果方案1不生效,可每次渲染卡片时给ChoiceSet生成唯一ID,提交时按前缀匹配取值即可:
var choiceSet = card.Body[1] as AdaptiveChoiceSetInput; // 新增:给ID加唯一后缀 var uniqueSuffix = Guid.NewGuid().ToString("N").Substring(0, 8); choiceSet.Id = $"substitution_{uniqueSuffix}"; choiceSet.Choices = adaptiveChoices;
后续接收提交结果时,遍历提交数据的键名,匹配前缀为substitution_的键即可拿到选择值,无需绑定固定ID。
方案3:替换为专用Adaptive Card提示器
普通TextPrompt对Adaptive Card提交的适配性较差,可改用Bot Framework官方的AdaptiveCardPrompt来接收卡片提交,内置了ID冲突规避和提交数据解析逻辑。
内容的提问来源于stack exchange,提问作者Matic Cavalleri
相关产品推荐
相关产品推荐

