MS Chat Bot -- 如何从我的 C# 代码访问自定义自适应卡片属性

MS Chat Bot --How to access custom adaptive card properties from my C# code

如何从我的 C# 代码中动态更改自定义自适应卡片的文本 属性 值?

这是我的 C# 代码

public static Attachment CreateMySearchCardAttachment()
        {
            // combine path for cross platform support
            string[] paths = { ".", "Resources", "MySearchCard.json" };
            var MySearchCardJson = File.ReadAllText(Path.Combine(paths));

            var adaptiveCardAttachment = new Attachment()
            {
                ContentType = "application/vnd.microsoft.card.adaptive",
                Content = JsonConvert.DeserializeObject(MySearchCardJson),

            };

            return adaptiveCardAttachment;
        }

我的 MySearchCard.json 文件在下面

{
  "type": "AdaptiveCard",
  "body": [
    {
      "type": "ColumnSet",
      "columns": [
        {
          "type": "Column",
          "items": [
            {
              "type": "Image",
              "horizontalAlignment": "Right",
              "spacing": "None",
              "url": "",
              "size": "Medium",
              "width": "2px",
              "height": "2px"
            },
            {
              "type": "TextBlock",
              "size": "Medium",
              "weight": "Bolder",
              "text": "Knowledgebase Search"
            },
            {
              "type": "Input.Text",
              "id": "searchText",
              "placeholder": "Type your search text and click Search"
            }
          ],
          "width": 2
        }
      ]
    }
  ],
  "actions": [
    {
      "type": "Action.Submit",
      "title": "Search"
    }
  ],
  "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
  "version": "1.0"
}
我能够让这张自适应卡片显示在我的聊天中 bot.But 不确定如何动态更改文本标签或其值。我们想在显示之前动态更改一些文本标签,然后在显示之后,根据用户动态显示或隐藏 response.At 稍后我们想在我需要之前将聊天 BoT 与 MS Teams.But 集成从我的模拟器中显示相同内容

如果你看我的 json,有一个文本 属性 和 "text":"Knowledgebase Search"。我的问题是 如何从我的 C# 代码中动态更改此文本值?

显示前动态变化

有几种不同的方法可以做到这一点。第一个选项可能是最好的,但它们都应该有效。

1。使用 AdaptiveCards Package

注意:这个包与 Microsoft.AdaptiveCards 不同并且比它更新 -- 不要使用这个

由于您知道要更改的卡片的确切部分,您可以:

string[] paths = { ".", "AdaptiveCard.json" };
var cardJson = File.ReadAllText(Path.Combine(paths));
var card = AdaptiveCard.FromJson(cardJson).Card;
var columnSet = (card.Body[0] as AdaptiveColumnSet);
var column = (columnSet.Columns[0] as AdaptiveColumn);
var knowledgeBlock = (column.Items[1] as AdaptiveTextBlock);
knowledgeBlock.Text = "Whatever You Want";

var attachment = new Attachment()
{
    Content = card,
    ContentType = "application/vnd.microsoft.card.adaptive"
};

var reply = stepContext.Context.Activity.CreateReply();
reply.Attachments = new List<Attachment>();

reply.Attachments.Add(attachment);

await stepContext.Context.SendActivityAsync(reply);

结果:

2。使用 Data Binding(预览版)

这是预览版,您仍然需要使用 #1 中的 NuGet 包,但可以更轻松地修改特定字段。

3。用 Newtonsoft.JSON

编辑 JSON

这可能更简单一些,但不太灵活。像这样的东西可以工作并产生与 #1:

相同的结果
string[] paths = { ".", "AdaptiveCard.json" };
var cardJsonObject = JObject.Parse(File.ReadAllText(Path.Combine(paths)));
var knowledgeToken = cardJsonObject.SelectToken("body[0].columns[0].items[1]");
knowledgeToken["text"] = "Whatever You Want";

var attachment = new Attachment()
{
    Content = cardJsonObject,
    ContentType = "application/vnd.microsoft.card.adaptive"
};

var reply = stepContext.Context.Activity.CreateReply();
reply.Attachments = new List<Attachment>();

reply.Attachments.Add(attachment);


await stepContext.Context.SendActivityAsync(reply);
return await stepContext.NextAsync();

显示后动态变化

显示后换卡有点困难。您首先必须像上面那样更改代码中的卡片。然后你必须使用 UpdateActivityAsync()。基本上,您发送一个 activity 与相同的 id,但是一张新卡,它会完全覆盖以前的卡。

注意:您只能在支持更新活动的频道中使用它。这通常很容易分辨,因为即使没有机器人,频道也会或不会让您编辑消息。听起来你想使用 Teams,所以这会很好。

您可以使用 了解如何使用 Teams 更新卡片活动。请注意,这是在 Node 中,但您仍然可以在 C# 中以相同的方式进行。

您也可以使用来自 MS Teams 团队成员之一的