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

如何在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对换行和列表解析有严格要求,问题根源在于模板的换行符和嵌套结构逻辑错误,调整方式如下:

  1. 统一换行符:将所有\r替换为\n,Teams对\n的兼容性更好。
  2. 修正嵌套列表格式:
    • 外层列表项后直接换行,紧跟缩进后的内层列表,确保内外层属于同一内容块,不要插入多余换行。
    • 内层列表项必须用4个空格缩进,且-和内容之间保留空格。
  3. 调整后的完整模板:
"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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 08:25:16