如何在Microsoft Teams机器人中获取Adaptive Card提交的反馈数据
实现方案
你不需要大幅修改现有自适应卡片的结构,提交时自适应卡片中所有Input控件的内容都会自动携带在提交 payload 里,我们只需要在Bot侧做对应处理即可:
- 第一步:调整自适应卡片提交动作(可选优化,方便你识别是反馈提交请求)
你可以给现有的Action.Submit加一个自定义的动作标识字段,方便后续在Bot的逻辑里快速判断这是反馈提交的请求,修改后的提交动作代码如下:
{ "type": "Action.Submit", "title": "Submit Feedback", "data": { "actionType": "feedbackSubmit", // 新增自定义标识 "msteams": { "type": "imBack", "value": "Feedback Submitted." } }, "style": "positive" }
- 第二步:在Bot的消息处理逻辑中捕获提交事件
当用户点击提交按钮后,Teams会把自适应卡片所有输入框的id和对应值封装到Activity.Value属性里传给你的Bot,你只需要读取这个属性即可。
C# SDK 示例代码:
protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken) { // 判断是否是自适应卡片的提交请求 if (turnContext.Activity.Value != null) { var feedbackData = turnContext.Activity.Value as JObject; // 判断是否是反馈提交动作 if (feedbackData?["actionType"]?.ToString() == "feedbackSubmit") { // 提取三个输入框的内容,只有用户选中显示的那个会有值 string question = feedbackData["Question"]?.ToString() ?? string.Empty; string suggestion = feedbackData["Suggestion"]?.ToString() ?? string.Empty; string comments = feedbackData["Comments"]?.ToString() ?? string.Empty; string feedbackType = string.Empty; string feedbackContent = string.Empty; if (!string.IsNullOrEmpty(question)) { feedbackType = "问题"; feedbackContent = question; } else if (!string.IsNullOrEmpty(suggestion)) { feedbackType = "建议"; feedbackContent = suggestion; } else if (!string.IsNullOrEmpty(comments)) { feedbackType = "留言"; feedbackContent = comments; } // 回传给用户的消息 string replyText = $"已收到你提交的{feedbackType}:{feedbackContent},感谢你的反馈!"; await turnContext.SendActivityAsync(MessageFactory.Text(replyText), cancellationToken); return; } } // 其他消息处理逻辑 await base.OnMessageActivityAsync(turnContext, cancellationToken); }
Node.js SDK 示例代码:
this.onMessage(async (context, next) => { if (context.activity.value) { const feedbackData = context.activity.value; if (feedbackData.actionType === 'feedbackSubmit') { const question = feedbackData.Question || ''; const suggestion = feedbackData.Suggestion || ''; const comments = feedbackData.Comments || ''; let feedbackType = ''; let feedbackContent = ''; if (question) { feedbackType = '问题'; feedbackContent = question; } else if (suggestion) { feedbackType = '建议'; feedbackContent = suggestion; } else if (comments) { feedbackType = '留言'; feedbackContent = comments; } const replyText = `已收到你提交的${feedbackType}:${feedbackContent},感谢你的反馈!`; await context.sendActivity(replyText); await next(); return; } } // 其他消息处理逻辑 await next(); });
- 第三步:空值校验(可选优化)
你可以在提取内容后加一层判断,如果用户没有填写内容就提交,可以提示用户请输入反馈内容后再提交,避免空数据。
内容的提问来源于stack exchange,提问作者AJ31
相关产品推荐
相关产品推荐

