Microsoft Teams消息扩展搜索结果分页功能无法正常工作问题
Microsoft Teams搜索类消息扩展分页失效解决方案
核心实现逻辑
Teams消息扩展的搜索分页是隐式触发机制,不存在你要找的「总结果数」配置字段,客户端不会通过你传的总条数判断是否展示分页控件,整个分页流程完全靠请求/响应的参数配合实现:
- 客户端发起搜索请求时,会自带两个分页参数:
queryOptions.count(单页期望返回的结果条数,桌面端默认25、移动端默认10)、queryOptions.skip(当前页需要跳过的结果条数,第一页固定为0) - 你返回第一页结果时,只要结果数组长度等于请求传入的count值,客户端就会自动判定存在下一页,滚动到结果底部时自动展示「加载更多」控件
- 用户触发下一页加载时,客户端会发起新的搜索请求,此时
queryOptions.skip值会累加count值(比如第一页skip=0,第二页skip=25,第三页skip=50),你根据这个skip值和count值返回对应偏移量的结果即可 - 当某一页你返回的结果数组长度小于count值时,客户端自动判定这是最后一页,不再触发后续加载请求
常见踩坑
以下错误操作会直接导致分页不生效:
- 第一页返回的结果条数小于请求传入的
queryOptions.count值,哪怕后台还有更多结果,客户端也会直接判定没有下一页 - 没有处理后续请求的
skip参数,每次请求都固定返回前N条第一页数据 - 自行在响应结构中添加不存在的
totalResults、paging等自定义字段,可能导致客户端响应解析异常,直接截断结果展示 - 把单页返回条数写死为固定值,没有读取请求里的count参数,和客户端期望的单页条数不匹配
DotNet 正确实现示例
// 解析Teams请求中的分页参数 var requestParams = JsonSerializer.Deserialize<JsonElement>(turnContext.Activity.Value.ToString()); var pageSize = requestParams.GetProperty("queryOptions").GetProperty("count").GetInt32(); var skipOffset = requestParams.GetProperty("queryOptions").GetProperty("skip").GetInt32(); // 执行业务搜索逻辑,拿到分页结果 var (pageItems, _) = await yourSearchService.Search( keyword: requestParams.GetProperty("queryText").GetString(), pageSize: pageSize, skip: skipOffset ); // 构造搜索响应,不需要传总结果数字段 var result = new MessagingExtensionResult { Type = "result", AttachmentLayout = "list", Attachments = pageItems.Select(item => { // 按业务需求构造结果对应的卡片附件即可 return item.ToAdaptiveCardAttachment(); }).ToList() }; await turnContext.SendActivityAsync(new Activity { Value = new MessagingExtensionResponse { ComposeExtension = result } });
内容的提问来源于stack exchange,提问作者Jan Martin
相关产品推荐
相关产品推荐

