AdaptiveCard在Teams中通过变量渲染无序列表失效问题
问题描述
我在AdaptiveCard里配置了Action.ToggleVisibility按钮,点击可展示底部含无序列表的文本区域。在AdaptiveCard Designer预览时列表显示正常,但在Teams中渲染时,只有Markdown粗体生效,无序列表被忽略。
关键现象:直接把文本赋值给$root.help属性时,无序列表能正常显示;但通过tipsText变量传递完全相同的文本内容时,列表就无法渲染。
相关配置代码如下:
AdaptiveCard JSON配置
{ "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", "type": "AdaptiveCard", "version": "1.5", "body": [ { "type": "ColumnSet", "columns": [ { "type": "Column", "items": [ { "type": "ActionSet", "actions": [ { "type": "Action.ToggleVisibility", "title": "tips", "tooltip": "show tips", "targetElements": [ "HelpToggle" ] } ] } ], "width": "stretch" } ] }, { "type": "ColumnSet", "columns": [ { "type": "Column", "width": 65, "items": [ { "type": "TextBlock", "text": "EXAMPLE CARD TITLE", "wrap": true, "size": "ExtraLarge", "horizontalAlignment": "Left", "weight": "Bolder", "spacing": "None" } ], "verticalContentAlignment": "Center", "spacing": "ExtraLarge" } ] }, { "type": "ColumnSet", "columns": [ { "type": "Column", "width": "stretch", "items": [ { "type": "ColumnSet" } ] } ] }, { "type": "Container", "items": [ { "type": "TextBlock", "text": "${help}", "wrap": true } ], "style": "accent", "bleed": true, "spacing": "None", "isVisible": false, "id": "HelpToggle" } ] }
渲染卡片的JavaScript函数
async createTipsCard(context, tipsText) { const template = new ACData.Template(tipsCard); const temp = template.expand({ $root: { // help: tipsText help: "Bullet list with tips: \r- **Tip 1**: Dummy text for tip #1. \r- **Tip 2**: Dummy text for tip #2." } }); await context.sendActivity({ text: '', attachments: [CardFactory.adaptiveCard(temp)] }); }
问题原因
Teams对AdaptiveCard动态绑定文本中的换行符处理存在兼容性差异:直接写在代码里的\r能被正确解析为换行,但通过变量传递时,\r可能被转义或者未被Teams识别,导致列表项没有正确分隔,无法触发无序列表的Markdown渲染逻辑。
解决方案
1. 标准化换行符格式
在传递变量前,将文本中的\r替换为Teams兼容的\n,修改JavaScript函数如下:
async createTipsCard(context, tipsText) { // 将\r替换为\n,确保Teams能识别换行 const formattedTips = tipsText.replace(/\r/g, '\n'); const template = new ACData.Template(tipsCard); const temp = template.expand({ $root: { help: formattedTips } }); await context.sendActivity({ text: '', attachments: [CardFactory.adaptiveCard(temp)] }); }
2. 直接传递兼容格式的文本
如果可以控制tipsText的内容,直接用\n作为换行符,比如传递的文本改为:
"Bullet list with tips: \n- **Tip 1**: Dummy text for tip #1. \n- **Tip 2**: Dummy text for tip #2."
3. 显式启用Markdown渲染
在AdaptiveCard的TextBlock中显式设置markdown: true,避免Teams默认行为的不确定性:
{ "type": "TextBlock", "text": "${help}", "wrap": true, "markdown": true }
内容的提问来源于stack exchange,提问作者john
相关产品推荐
相关产品推荐

