You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Microsoft.Bot.Builder中为Teams机器人实现两级下拉选择

多级下拉选择在Teams消息扩展中的实现方案

可行,你可以通过在OnTeamsMessagingExtensionSelectItemAsync中返回新的下拉选项列表而非直接生成卡片,来实现二级下拉选择的需求。核心思路是通过自定义数据标识选中项的层级,在选择事件中动态返回对应层级的选项或最终卡片。

实现步骤

  1. 定义层级标识类
    创建一个自定义类来存储选项的层级信息和业务数据,用于区分当前处理的是哪一级选择:

    public class SelectionItem
    {
        public string Type { get; set; } // 标识层级:"Level1" 或 "Level2"
        public string Id { get; set; } // 选项ID
        public string Name { get; set; } // 选项显示名称
    }
    
  2. 返回第一级下拉选项
    在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
            }
        };
    }
    
  3. 处理选择事件,动态返回下一级选项或最终卡片
    在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 19:52:38