.NET开发Teams搜索扩展:关闭选中项自适应卡片后显示无匹配而非返回搜索列表
核心根因
- Teams 搜索扩展的视图切换逻辑本身不会自动记忆之前的搜索上下文:点击列表项后,详情卡片会完全替换原来的搜索列表渲染容器;当用户手动关闭详情卡片时,Teams 会主动向 Bot 发起一次新的搜索请求来重新填充列表区域。
- 现有实现的断联点在于:
OnTeamsMessagingExtensionSelectItemAsync方法返回详情卡片响应时,完全没有把原搜索流程的关键上下文(用户输入的搜索词、当前分页位置、缓存的结果标识)通过State字段回传给 Teams,导致这次自动发起的重查请求没有携带搜索关键词,最终命中“无匹配结果”的提示。 - 虽然已经在
OnTeamsMessagingExtensionQueryAsync中写了基于query.State恢复用户配置的逻辑,但因为详情卡片返回时根本没生成对应的状态值传给前端,这部分恢复逻辑全程没有触发。
落地修复步骤
给列表项的点击载荷补全上下文
现在列表项的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 } }在详情卡片的返回响应中补全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) });适配查询接口的状态解析分支
修改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
相关产品推荐
相关产品推荐

