C#开发Teams动态Adaptive Card@用户渲染失败求助
Teams动态Adaptive Card用户提及渲染失败问题
我用C#开发Teams中支持用户提及的动态Adaptive Card,静态模板(含固定用户列表)能正常运行,但动态传入序列化后的用户数据时,内容完全无法显示。序列化后的JSON结构和静态数据一致,但渲染就是失效,求解决办法。
静态模板(可正常运行)
{ "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", "version": "1.0", "type": "AdaptiveCard", "body": [ { "type": "TextBlock", "$data": [ { "name": "Matt" }, { "name": "David" }, { "name": "Thomas" } ], "text": "hi, <at>${name}</at>" } ], "msteams": { "entities": [ { "type": "mention", "$data": [ { "name": "Matt" }, { "name": "David" }, { "name": "Thomas" } ], "text": "<at>${name}</at>", "mentioned": { "id": "${name}", "name": "${name}" } } ] } }
尝试的动态模板
{ "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", "version": "1.0", "type": "AdaptiveCard", "body": [ { "type": "TextBlock", "$data": ${user}, "text": "hi, <at>${name}</at>" } ], "msteams": { "entities": [ { "type": "mention", "$data": ${user}, "text": "<at>${name}</at>", "mentioned": { "id": "${name}", "name": "${name}" } } ] } }
C#序列化代码
List<MentionUser> userMentionList = new List<MentionUser>(); AdaptiveCardTemplate template = new AdaptiveCardTemplate(File.ReadAllText("Resources/Mention.json")); var json = new List<MentionedList>(); foreach (var subscription in SubscriptionMentions) { var element = new MentionUser { name = subscription, }; userMentionList.Add(element); } json.Add(new MentionedList { instructions = userMentionList}); string jsonString = System.Text.Json.JsonSerializer.Serialize(json); var data = new { user = jsonString, }; string cardJson = template.Expand(""); var card = SerializeCard(cardJson);
序列化后的JSON字符串
[{"name":"username"},{"name":"username"}]}]
问题排查与解决
核心问题:数据格式传递错误
你现在把user字段赋值为序列化后的JSON字符串,模板渲染时会把它当成普通字符串处理,而不是JSON数组。Adaptive Card模板需要的是对象/数组类型的原始数据,不是字符串。代码修正方案
直接传递用户列表对象给模板,不需要手动序列化:List<MentionUser> userMentionList = new List<MentionUser>(); AdaptiveCardTemplate template = new AdaptiveCardTemplate(File.ReadAllText("Resources/Mention.json")); foreach (var subscription in SubscriptionMentions) { var element = new MentionUser { name = subscription, }; userMentionList.Add(element); } // 直接传递用户列表对象,无需转成字符串 var data = new { user = userMentionList, }; // 把data对象传入模板展开,不是空字符串 string cardJson = template.Expand(data); var card = SerializeCard(cardJson);额外修复点
- 你提供的序列化后JSON有语法错误(多了一个
}]),修正代码后会生成结构正确的JSON。 - Teams的用户提及要求
mentioned.id必须是用户的UPN或AAD ID,不能直接用用户名,否则无法正确触发提及提醒,建议替换为用户的实际标识。
- 你提供的序列化后JSON有语法错误(多了一个
内容的提问来源于stack exchange,提问作者Lele
相关产品推荐
相关产品推荐

