Art*_*ous 8 c# botframework adaptive-cards
我想使用自适应卡设计器创建(然后编辑)自适应卡设计,并在我的机器人中使用它们.
1)我在Designer中创建了自适应卡,带有样本值,并复制了它的JSON表示.例如:
{
"type": "AdaptiveCard",
"body": [
{
"type": "FactSet",
"id": "myFactSet",
"facts": [
{
"title": "Name:",
"value": "John Doe"
}
]
}
],
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"version": "1.0"
}
Run Code Online (Sandbox Code Playgroud)
2)现在我想在我的C#Bot Framework机器人中使用这张卡的设计.我把这个JSON放到我的项目中,其中包含了AdaptiveCards v1.1.0 nuget包.
3)我用这行代码将卡JSON解析为AdaptiveCards库类:
var card = AdaptiveCard.FromJson(card).Card;
Run Code Online (Sandbox Code Playgroud)
4)在将卡发送给用户之前,我必须用实际值填充它,替换样本数据.
如何"John Doe"
使用真实用户名替换?什么是最简单的方法?(我已经写了一个扩展方法来获取AdaptiveElement
它的id,所以我可以很容易地改变它的值.但请告诉我,如果有一个更简单的方法)
我如何克隆现有的AdaptiveElement
并将其他值放入其中?例如,如果我想FactSet
通过复制现有myFactSet
的所有相同样式来添加另一个卡?AdaptiveElement
没Clone()
办法.
我希望能够使用Designer轻松编辑卡片的设计,但如果我用C#代码重写整张卡片,每次卡片的设计发生变化时我都要对其进行更改,我不会看到设计师的结果.
我知道用javascript很容易做到,但我在我的机器人中使用C#.
我也明白,我可以解析卡片JsonObject
并直接处理JsonObject
s,克隆它们,改变它们的属性,但是
它们没有输入,因此没有IntelliSense支持,我可以输入错字
我仍然需要遍历所有元素以找到具有给定id的那个元素(顺便说一句,是否有一个扩展方法可以轻松地执行此操作?)
使用JsonObject
不会消除AdaptiveCards库的需要和调用AdaptiveCard.FromJson(card)
方法的需要(因为设置Attachment.Content
为a JsonObject
由于某种原因不起作用).
请记住,JSON 只是一个字符串,我认为您的两个问题都可以通过字符串操作来解决。
- 如何替换
"John Doe"
为真实用户名?最简单的方法是什么?
您可以先替换 JSON 中的“John Doe”,然后再将其转换为 C# 对象:
json = json.Replace("John Doe", userName);
var card = AdaptiveCard.FromJson(json).Card;
Run Code Online (Sandbox Code Playgroud)
- 如何克隆现有的值
AdaptiveElement
并将其他值放入其中?
C# 中的深度复制问题被广泛讨论。通过一些独创性,您可以对任何对象进行深度复制,自适应卡元素也不例外。您可以使用复制任何对象的技术,也可以创建专门为自适应卡定制的函数。由于自适应卡都是关于 JSON 的,因此请考虑将元素转换为 JSON,然后再转换回来:
var factSet = card.Body.First() as AdaptiveFactSet;
factSet = JsonConvert.DeserializeObject<AdaptiveFactSet>(JsonConvert.SerializeObject(factSet));
factSet.Facts.First().Value = userName;
card.Body.Add(factSet);
Run Code Online (Sandbox Code Playgroud)
但是,您可能甚至不需要担心深度复制,因为您是从 JSON 开始的。也许您可以从设计器获取特定元素的 JSON,然后多次反序列化它:
factSet1 = JsonConvert.DeserializeObject<AdaptiveFactSet>(factSetJson);
factSet2 = JsonConvert.DeserializeObject<AdaptiveFactSet>(factSetJson);
Run Code Online (Sandbox Code Playgroud)
我希望能够使用设计器轻松编辑卡片的设计,但是如果我用 C# 代码重写整个卡片,则每次卡片的设计发生变化时我都必须对其进行更改,而且我看不到设计器中的结果。
如果您的卡片同时以 C# 和 JSON 表示,那么在设计器中进行一些小的更改以查看其外观,然后相应地修改您的 C# 应该不会太困难。如果您认为拥有一个可以获取卡的 JSON 并自动编写可以生成它的 C# 的工具真的很酷,那么我同意:)