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 团队成员之一的 。
如何从我的 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"
}
如果你看我的 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,所以这会很好。
您可以使用
您也可以使用来自 MS Teams 团队成员之一的