如何在Microsoft.Bot.Builder中为Teams机器人实现两级下拉选择
多级下拉选择在Teams消息扩展中的实现方案
可行,你可以通过在OnTeamsMessagingExtensionSelectItemAsync中返回新的下拉选项列表而非直接生成卡片,来实现二级下拉选择的需求。核心思路是通过自定义数据标识选中项的层级,在选择事件中动态返回对应层级的选项或最终卡片。
实现步骤
定义层级标识类
创建一个自定义类来存储选项的层级信息和业务数据,用于区分当前处理的是哪一级选择:public class SelectionItem { public string Type { get; set; } // 标识层级:"Level1" 或 "Level2" public string Id { get; set; } // 选项ID public string Name { get; set; } // 选项显示名称 }返回第一级下拉选项
在OnTeamsMessagingExtensionQueryAsync中生成第一级选项,将其封装为HeroCard附件并返回:protected override async Task<MessagingExtensionResponse> OnTeamsMessagingExtensionQueryAsync(ITurnContext<IInvokeActivity> turnContext, MessagingExtensionQuery query, CancellationToken cancellationToken) { var level1Items = new List<SelectionItem> { new SelectionItem { Type = "Level1", Id = "1", Name = "分类A" }, new SelectionItem { Type = "Level1", Id = "2", Name = "分类B" } }; var attachments = level1Items.Select(item => new HeroCard { Title = item.Name, Content = item // 存储自定义数据,供后续选择事件使用 }.ToAttachment()).ToList(); return new MessagingExtensionResponse { ComposeExtension = new MessagingExtensionResult { AttachmentLayout = AttachmentLayoutTypes.List, Type = "result", Attachments = attachments } }; }处理选择事件,动态返回下一级选项或最终卡片
在OnTeamsMessagingExtensionSelectItemAsync中,根据选中项的层级标识,决定返回第二级下拉选项还是最终卡片:protected override async Task<MessagingExtensionResponse> OnTeamsMessagingExtensionSelectItemAsync(ITurnContext<IInvokeActivity> turnContext, JObject query, CancellationToken cancellationToken) { var selectedItem = query.ToObject<SelectionItem>(); if (selectedItem.Type == "Level1") { // 根据第一级选项ID生成第二级选项 var level2Items = GetLevel2Options(selectedItem.Id); var attachments = level2Items.Select(item => new HeroCard { Title = item.Name, Content = item }.ToAttachment()).ToList(); return new MessagingExtensionResponse { ComposeExtension = new MessagingExtensionResult { AttachmentLayout = AttachmentLayoutTypes.List, Type = "result", Attachments = attachments } }; } else if (selectedItem.Type == "Level2") { // 生成最终展示的自适应卡片 var finalCard = new AdaptiveCard(new AdaptiveSchemaVersion(1.0)) { Body = { new AdaptiveTextBlock { Text = $"已选择:{selectedItem.Name}", Size = AdaptiveTextSize.Large } } }; return new MessagingExtensionResponse { ComposeExtension = new MessagingExtensionResult { AttachmentLayout = AttachmentLayoutTypes.List, Type = "result", Attachments = new List<Attachment> { finalCard.ToAttachment() } } }; } return null; } // 模拟根据第一级ID获取第二级选项的业务方法 private List<SelectionItem> GetLevel2Options(string level1Id) { return level1Id switch { "1" => new List<SelectionItem> { new SelectionItem { Type = "Level2", Id = "1-1", Name = "子分类A1" }, new SelectionItem { Type = "Level2", Id = "1-2", Name = "子分类A2" } }, "2" => new List<SelectionItem> { new SelectionItem { Type = "Level2", Id = "2-1", Name = "子分类B1" }, new SelectionItem { Type = "Level2", Id = "2-2", Name = "子分类B2" } }, _ => new List<SelectionItem>() }; }
关键说明
- 通过
SelectionItem.Type字段明确当前选中项的层级,确保逻辑分支清晰 - 所有返回的
MessagingExtensionResult类型均为result,并使用AttachmentLayoutTypes.List布局,Teams会自动将其渲染为下拉选项列表 - 可以根据业务需求扩展更多层级,只需在
SelectionItem中增加层级标识,并重写OnTeamsMessagingExtensionSelectItemAsync中的逻辑分支即可
内容的提问来源于stack exchange,提问作者VicFerron
相关产品推荐
相关产品推荐

