如何捕获自适应卡片提交数据并在瀑布流对话框第二步生成响应?
解决Waterfall Dialog中捕获Adaptive Card提交数据且不显示为用户消息的问题
我明白你的需求:点击Adaptive Card的提交按钮后,不想让卡片的data以用户消息的形式出现在对话里,同时要捕获这个数据并在瀑布流的第二步使用它。咱们来一步步解决这个问题:
问题根源
你当前用stepContext.prompt()来等待用户选择,而Adaptive Card的Action.Submit默认会把data作为用户文本消息提交到对话中,这就是为什么你会看到它显示成用户消息的原因。要避免这个,我们需要替换prompt的等待逻辑,直接拦截卡片的提交事件。
解决方案步骤
1. 修改瀑布流第一步:移除prompt,等待用户交互
把Step1里的prompt去掉,发送卡片后返回Dialog.EndOfTurn,让对话停在当前步骤,等待用户的卡片操作:
async Step1(stepContext) { await stepContext.context.sendActivity({ attachments: [ this.createAdaptiveCard1(), this.createAdaptiveCard2(), this.createAdaptiveCard3() ], attachmentLayout: AttachmentLayoutTypes.Carousel }); // 不使用prompt,返回EndOfTurn等待用户的卡片提交动作 return Dialog.EndOfTurn; }
2. 拦截卡片提交消息,阻止其显示为用户消息
在你的Dialog类中重写OnContinueDialogAsync方法,用来捕获卡片提交的value(也就是你的DATA),并且不让这条消息进入对话历史:
async OnContinueDialogAsync(innerDc, cancellationToken) { const activity = innerDc.context.activity; // 判断是否是Adaptive Card提交的消息 if (activity.type === ActivityTypes.Message && activity.value) { // 直接推进瀑布流到下一步,把卡片data作为结果传递 return await innerDc.next(activity.value); } // 其他情况走默认逻辑 return await base.OnContinueDialogAsync(innerDc, cancellationToken); }
3. 在第二步中使用捕获到的数据
现在Step2可以直接通过stepContext.result拿到卡片提交的DATA,然后执行你需要的sendActivity操作:
async Step2(stepContext) { // 获取卡片提交的数据 const selectedData = stepContext.result; // 这里执行你的业务逻辑,比如发送自定义消息 await stepContext.context.sendActivity(`基于你选择的数据,执行相关操作:${selectedData}`); // 结束对话框或者继续后续步骤 return await stepContext.endDialog(); }
额外提示
如果你的卡片data是复杂对象(比如{"key": "value", "id": 123}),这个方案同样适用,stepContext.result会完整接收这个对象,你可以直接解构使用。
内容的提问来源于stack exchange,提问作者uitwaa
相关产品推荐
相关产品推荐

