c# - 更新已在 C# 中的 Bot Framework v4 中发布的 Adaptive Card

标签 c# botframework bots

我正在使用 C# 中的 Bot Framework v4 开发一个机器人。我现在想要的是,在使用 Actions 向用户发送 Adaptive Card 之后,我可以在 Action 被触发后更新这张卡。 例如,按钮将在点击后消失。

Link to NodeJS Solution

这里我有一个 NodeJS 解决方案,但我无法将其转移到 C#。 有人可以帮忙吗?

更多项目详情: 我有一张看起来像这样的自适应卡: enter image description here

在我使用 SharePoint 库中的 MS Graph 进行搜索后,将生成此卡片。

主要目标是,我可以使用 Refiner 使用来自 JSON 的新卡片更新卡片。 “确定”按钮是一个提交操作,可以在 OnMessageActivityAsync 方法中捕获。 输入值位于事件值中,因此可以创建过滤方法。 我的问题是,我无法更新已发送给用户的卡。

在我将带有结果的第一张卡片发送给用户之前,我将事件写入一个状态,这样我就可以访问 OnMessageActivityAsync 方法,但我不确定这是否是正确的方法。

protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
    {
        Logger.LogInformation("Running dialog with Message Activity.");

        var txt = turnContext.Activity.Text;
        dynamic val = turnContext.Activity.Value;
        // Check if the activity came from a submit action
        if (string.IsNullOrEmpty(txt) && val != null)
        {
            await turnContext.SendActivityAsync(MessageFactory.Text($"Refiner Language: {val.id_language}"));
            await turnContext.SendActivityAsync(MessageFactory.Text($"Refiner MachType: {val.id_type}"));

            var r = new StreamReader("Cards/helloCard2.json");
            string json = r.ReadToEnd();
            AdaptiveCard card = AdaptiveCard.FromJson(json).Card;

            var docSearchState = await StateAccessor.GetAsync(turnContext);
            Activity activity = docSearchState.Activity;
            activity.Attachments = new List<Attachment>() {
                new Attachment()
                {
                    Name = "Card",
                    ContentType = AdaptiveCard.ContentType,
                    Content = card,
                }
            };

            await turnContext.UpdateActivityAsync(activity);
        }

此代码给我以下错误消息:

fail: Microsoft.Bot.Builder.Integration.AspNet.Core.BotFrameworkHttpAdapter[0]
  Exception caught : Error reading JArray from JsonReader. Current JsonReader item is not an array: StartObject. Path 'DocumentSearchState.Activity.attachments.$values[0].content.body'.

有没有人有解决这个问题的好主意?

最佳答案

看看this answer了解如何更新自适应卡片。

您可以编写代码以动态地从自适应卡片中删除提交操作,或者您可以拥有两种不同版本的卡片:一种带有提交操作,一种没有。

如果您希望通过可以安装在 NuGet 包中的预构建代码简化整个过程,请随时在 GitHub 上表达您对这些想法的支持:

关于c# - 更新已在 C# 中的 Bot Framework v4 中发布的 Adaptive Card,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58101093/

相关文章:

azure - 无法将机器人连接到 Skype For Business Online

c# - N-Layer/N-Tier 错误处理设计

c# - 如何更改/设置从 TLB (TLH) 中的 EventArgs 继承的 COM 类的 GUID

c# - List<T> 和 IQueryable<T> 之间的执行差异

java - 我的消息在 BotFramework - Java 中未按正确的顺序发送

html - 设置隐藏字段对机器人有效吗?

c# - C# 中的 GetHashCode 指南

javascript - Microsoft BotFramework - 建议的卡片

python - 使用 PIL 在另一个图像之上的图像上写文本

c# - PromptDialog 用于未确定数量的问题