使用自适应卡设计器,然后在C#中使用实际值替换样本值

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)在将卡发送给用户之前,我必须用实际值填充它,替换样本数据.

问题

  1. 如何"John Doe"使用真实用户名替换?什么是最简单的方法?(我已经写了一个扩展方法来获取AdaptiveElement它的id,所以我可以很容易地改变它的值.但请告诉我,如果有一个更简单的方法)

  2. 我如何克隆现有的AdaptiveElement并将其他值放入其中?例如,如果我想FactSet通过复制现有myFactSet的所有相同样式来添加另一个卡?AdaptiveElementClone()办法.

为什么其他解决方案不合适

用C#写

我希望能够使用Designer轻松编辑卡片的设计,但如果我用C#代码重写整张卡片,每次卡片的设计发生变化时我都要对其进行更改,我不会看到设计师的结果.

在javascript中执行此操作

我知道用javascript很容易做到,但我在我的机器人中使用C#.

解析JSON并使用它

我也明白,我可以解析卡片JsonObject并直接处理JsonObjects,克隆它们,改变它们的属性,但是

  1. 它们没有输入,因此没有IntelliSense支持,我可以输入错字

  2. 我仍然需要遍历所有元素以找到具有给定id的那个元素(顺便说一句,是否有一个扩展方法可以轻松地执行此操作?)

  3. 使用JsonObject不会消除AdaptiveCards库的需要和调用AdaptiveCard.FromJson(card)方法的需要(因为设置Attachment.Content为a JsonObject由于某种原因不起作用).

Kyl*_*ney 1

请记住,JSON 只是一个字符串,我认为您的两个问题都可以通过字符串操作来解决。

  1. 如何替换"John Doe"为真实用户名?最简单的方法是什么?

您可以先替换 JSON 中的“John Doe”,然后再将其转换为 C# 对象:

json = json.Replace("John Doe", userName);
var card = AdaptiveCard.FromJson(json).Card;
Run Code Online (Sandbox Code Playgroud)
  1. 如何克隆现有的值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# 的工具真的很酷,那么我同意:)