繁体   English   中英

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与MS Teams集成。但是在此之前,我需要显示相同的内容从我的模拟器

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

在显示之前进行动态更改

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

1.使用AdaptiveCards软件包

注意:此软件包不同于Microsoft.AdaptiveCards ,并且比Microsoft更新。-不要使用此软件包

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

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.使用数据绑定 (在预览中)

这是预览,您仍然需要使用#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() 基本上,您发送具有相同id的活动,但是发送了一张新卡,它会完全覆盖前一张卡。

注意:您只能在支持更新活动的渠道中使用此功能。 这通常很容易告诉您,因为即使没有漫游器,该频道也会允许或不允许您编辑消息。 听起来您好像想使用团队,这样就可以正常工作。

您可以在此处使用我的答案来了解如何更新团队的卡片活动。 请注意,这是在Node中的,但是您仍然可以用C#相同的方式进行操作。

您还可以使用MS Teams团队中一位成员的其他StackOverflow答案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM