在Teams Toolkit C# Bot中如何捕获Action.Submit提交事件
处理自适应卡片Submit操作的捕获方法
在基于ICommandHandler的Teams Bot中,自适应卡片的Submit操作不会被ICommandHandler捕获——因为它不是文本命令,而是以InvokeActivity的形式发送给Bot的。你需要单独处理Invoke类型的请求,具体步骤如下:
- 区分请求类型:在Bot的核心处理逻辑(比如
OnTurnAsync方法)中,先判断Activity类型是否为ActivityTypes.Invoke,再进一步判断Invoke的名称是否为adaptiveCard/action,这就是自适应卡片Submit操作的标识。 - 提取提交数据:从
context.Activity.Value中获取卡片提交的JSON数据,可反序列化为自定义模型类来使用。 - 返回响应:必须向Teams客户端返回
InvokeResponse(状态码200),否则会触发提交失败的提示。
示例代码片段
public override async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default) { // 先执行原有命令处理逻辑 await base.OnTurnAsync(turnContext, cancellationToken); // 捕获自适应卡片Submit操作 if (turnContext.Activity.Type == ActivityTypes.Invoke && turnContext.Activity.Name == "adaptiveCard/action") { // 反序列化提交的数据(替换成你的卡片模型类) var cardSubmitData = JsonConvert.DeserializeObject<YourCardSubmitModel>( turnContext.Activity.Value.ToString()); // 处理业务逻辑,比如回复用户确认 await turnContext.SendActivityAsync( MessageFactory.Text($"已收到你的提交:{cardSubmitData.YourInputField}"), cancellationToken); // 返回成功响应给Teams客户端 await turnContext.SendActivityAsync(new Activity { Type = ActivityTypes.InvokeResponse, Value = new InvokeResponse { Status = 200, Body = new { Success = true, Message = "提交处理完成" } } }, cancellationToken); } }
额外提示
如果你的Bot使用Teams Framework v4+,也可以通过注册IInvokeHandler的方式,将自适应卡片的处理逻辑单独抽离成一个类,让代码结构更清晰,避免在OnTurnAsync中堆积过多判断。
内容的提问来源于stack exchange,提问作者Orthodox Christian
相关产品推荐
相关产品推荐

