如何在Teams的AdaptiveCard中正确生成动态嵌套项目符号列表?
问题:AdaptiveCard嵌套列表在Teams中格式异常
我通过Watcher动作向Teams频道发送消息,为创建嵌套项目符号列表,在AdaptiveCard的body中添加了如下TextBlock:
"body":[ { "type": "TextBlock", "text": "Found the following [events]({{ url }}:{{ port }}/app/discover#/?_g=(filters:!(),refreshInterval:(pause:!t,value:0),time:(from:{{ watcher_config.start_range }},to:{{ watcher_config.end_range }}))&_a=(columns:!(request),filters:!(('$state':(store:appState),meta:(alias:!n,disabled:!f,index:'{{ watcher_index }}',key:query,negate:!f,type:custom,value:'%7B%22bool%22:%7B%22must%22:%5B%7B%22range%22:%7B%22@timestamp%22:%7B%22gte%22:%22{{ watcher_config.start_range }}%22,%22lt%22:%22{{ watcher_config.end_range }}%22%7D%7D%7D,%7B%22bool%22:%7B%22{{ watcher_config.regex_match }}%22:%5B%7B%22regexp%22:%7B%22request%22:%22{{ watcher_config.regex }}%22%7D%7D%5D%7D%7D,%7B%22bool%22:%7B%22must%22:%5B%7B%22range%22:%7B%22response%22:%7B%22gte%22:{{ watcher_config.start_response_status }},%22lt%22:{{ watcher_config.end_response_status }}%7D%7D%7D%5D%7D%7D%5D%7D%7D'),query:(bool:(must:!((range:('@timestamp':(gte:{{ watcher_config.start_range }},lt:{{ watcher_config.end_range }}))),(bool:({{watcher_config.regex_match }}:!((regexp:(request:'{{ watcher_config.regex }}'))))),(bool:(must:!((range:(response:(gte:{{ watcher_config.start_response_status }},lt:{{ watcher_config.end_response_status }}))))))))))),index:'{{ watcher_index }}',interval:auto,query:(language:kuery,query:''),sort:!())) matching error responses in the last {{ watcher_config.interval }}: \r - {{ '{{' }}#ctx.payload.aggregations.group_by_kong_route.buckets{{ '}}' }} {{ '{{' }}key{{ '}}' }} ({{ '{{' }}doc_count{{ '}}' }}) {{ '{{' }}#group_by_response_code.buckets{{ '}}' }} \r - {{ '{{' }}key{{ '}}' }} ({{ '{{' }}doc_count{{ '}}' }}) \r {{ '{{' }}/group_by_response_code.buckets{{ '}}' }} \r{{ '{{' }}/ctx.payload.aggregations.group_by_kong_route.buckets{{ '}}' }} \r" } ]
预期显示效果:
- /myapp/api/basic (330)
- 429 (221)
- 404 (109)
- /myapp/bike (323)
- 429 (214)
- 404 (109)
- /myapp/rest/build (147)
- 429 (81)
- 404 (64)
- 403 (2)
- /myapp/bike/532669 (122)
- 429 (90)
- 404 (32)
- /myapp/bike/make (84)
- 429 (84)
实际显示效果:
- /myapp/api/basic (330)
- 429 (221)
- 404 (109)
/myapp/bike (323)
-429 (214)
-404 (109)/myapp/rest/build (147)
-429 (81)
-404 (64)
-403 (2)/myapp/bike/532669 (122)
-429 (90)
-404 (32)/myapp/bike/make (84)
-429 (84)
解决方案
Teams的AdaptiveCard TextBlock对换行和列表解析有严格要求,问题根源在于模板的换行符和嵌套结构逻辑错误,调整方式如下:
- 统一换行符:将所有
\r替换为\n,Teams对\n的兼容性更好。 - 修正嵌套列表格式:
- 外层列表项后直接换行,紧跟缩进后的内层列表,确保内外层属于同一内容块,不要插入多余换行。
- 内层列表项必须用4个空格缩进,且
-和内容之间保留空格。
- 调整后的完整模板:
"body":[ { "type": "TextBlock", "text": "发现以下异常事件 在过去{{ watcher_config.interval }}内匹配到错误响应:\n- {{#ctx.payload.aggregations.group_by_kong_route.buckets}}{{key}} ({{doc_count}})\n - {{#group_by_response_code.buckets}}{{key}} ({{doc_count}})\n {{/group_by_response_code.buckets}}\n{{/ctx.payload.aggregations.group_by_kong_route.buckets}}" } ]
关键调整点:
- 替换所有
\r为\n,避免换行解析混乱 - 外层列表项与内层列表项连续排版,无多余空行
- 内层列表项用4个空格严格缩进,确保Teams识别为嵌套结构
同时需确认Watcher模板引擎渲染时不会丢失缩进和换行格式,调整后Teams将正确识别嵌套列表结构。
内容的提问来源于stack exchange,提问作者runnerpaul
相关产品推荐
相关产品推荐

