You need to enable JavaScript to run this app. .NET开发Teams搜索扩展:关闭选中项自适应卡片后显示无匹配而非返回搜索列表
优惠活动
大模型
产品
解决方案
定价
更多

.NET开发Teams搜索扩展:关闭选中项自适应卡片后显示无匹配而非返回搜索列表

核心根因
  • Teams 搜索扩展的视图切换逻辑本身不会自动记忆之前的搜索上下文:点击列表项后,详情卡片会完全替换原来的搜索列表渲染容器;当用户手动关闭详情卡片时,Teams 会主动向 Bot 发起一次新的搜索请求来重新填充列表区域。
  • 现有实现的断联点在于:OnTeamsMessagingExtensionSelectItemAsync 方法返回详情卡片响应时,完全没有把原搜索流程的关键上下文(用户输入的搜索词、当前分页位置、缓存的结果标识)通过 State 字段回传给 Teams,导致这次自动发起的重查请求没有携带搜索关键词,最终命中“无匹配结果”的提示。
  • 虽然已经在 OnTeamsMessagingExtensionQueryAsync 中写了基于 query.State 恢复用户配置的逻辑,但因为详情卡片返回时根本没生成对应的状态值传给前端,这部分恢复逻辑全程没有触发。
落地修复步骤
  1. 给列表项的点击载荷补全上下文
    现在列表项的Tap事件只传了选中的实体对象,拿到详情数据后拿不到之前的搜索上下文。把载荷改成组合结构,把当前搜索关键词、分页参数一并存在Tap的Value里,确保点击触发SelectItem时能拿到完整上下文:

    // 替换原来仅传 constitunetSummary 的Tap配置
    Tap = new CardAction
    {
        Type = "invoke",
        Value = new 
        {
            SelectedItem = constitunetSummary,
            CurrentSearchText = text,
            CurrentSkip = query.QueryOptions.Skip,
            CurrentCount = query.QueryOptions.Count
        }
    }
    
  2. 在详情卡片的返回响应中补全State回传
    OnTeamsMessagingExtensionSelectItemAsync 方法中,从传入的invoke载荷里取出刚才存的上下文,序列化后放到响应的根级State字段返回给Teams。Teams 会自动把这个State值存起来,等用户关闭详情卡片发起重查时,会原样把State带回查询接口:

    // 解构拿到invoke请求里的完整载荷
    var payload = query.ToObject<ItemSelectRequest>();
    // 构造需要回传的状态对象,包含恢复列表需要的所有信息
    var returnState = new 
    {
        UserConfig = userConfigSettings,
        SearchText = payload.CurrentSearchText,
        Skip = payload.CurrentSkip,
        Count = payload.CurrentCount
    };
    
    return Task.FromResult(new MessagingExtensionResponse
    {
        ComposeExtension = new MessagingExtensionResult
        {
            Type = "result",
            AttachmentLayout = "list",
            Attachments = new List<MessagingExtensionAttachment> { attachment }
        },
        // 关键:把序列化后的状态返回给前端
        State = JsonConvert.SerializeObject(returnState)
    });
    
  3. 适配查询接口的状态解析分支
    修改OnTeamsMessagingExtensionQueryAsync中处理query.State的逻辑,从State里解析出原搜索关键词、分页参数,直接套用已经缓存的搜索结果,不需要重复调用后端接口,就能快速还原之前的列表视图:

    if (state != null)
    {
        var stateInfo = JsonConvert.DeserializeObject<SearchStateModel>(state);
        userConfigSettings = stateInfo.UserConfig;
        // 把State里存的原搜索词赋值给查询参数,避免空值
        text = stateInfo.SearchText;
        // 替换自动重查时带的分页参数
        query.QueryOptions.Skip = stateInfo.Skip;
        query.QueryOptions.Count = stateInfo.Count;
        await _userConfigProperty.SetAsync(turnContext, userConfigSettings, cancellationToken);
    }
    
附带的代码bug修正
  • 现有OnTeamsMessagingExtensionSelectItemAsync方法构造详情页预览卡片时,图片URL取值的变量存在拼写错误:写成了constitunetSummary.Url,实际传入的实体变量是constituentSummary,会导致预览图加载失败,需要修正变量名。
  • 不要在详情卡片视图的返回响应里覆盖分页相关的上下文,只要State回传正确,Teams 会自动在关闭详情时触发和初始搜索一致的查询逻辑,完全恢复原列表。

内容的提问来源于stack exchange,提问作者shashika nirmani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.04 21:15:01