如何在后续瀑布步骤中检索自适应卡的表单提交

2023-12-13

我正在使用 Bot Framework (V4),并且我有一个包含两个步骤的 WaterfallDialog;第一步是捕获表单数据,第二步是处理表单数据。

第一步发送回复:

private async Task<DialogTurnResult> CaptureFormStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
    var reply = await stepContext.Context.Activity.GetReplyFromCardAsync("BusinessyForm");
    await stepContext.Context.SendActivityAsync(reply, cancellationToken);
}

The GetReplyFromCardAsync是一个扩展方法,它采用 JSON 表示形式Activity并附有一张自适应卡。自适应卡的形式类似于this。自适应卡还具有提交操作。

我的问题是这些信息应该如何传递到下一步?

在之前的尝试中,我返回了一个提示:

return await stepContext.PromptAsync(
    "custom-prompt-id", 
    new PromptOptions { Prompt = MessageFactory.Text("Hello!") }, 
    cancellationToken);

但在这种情况下,我不想提示用户提供附加信息。理想情况下,我想“保持”对话框状态以进行响应,并且当检测到响应时,下一步将处理提交结果。

我尝试过的事情:

  • 回顾过的例子here and here。两者都显示了如何渲染卡片,但没有显示如何处理后续步骤中的输入。
  • 审查了输入的卡架构文档here.
  • 审查了 GitHub 的 AdaptiveCard 存储库中类似问题的讨论here.

这可行吗?任何帮助将非常感激!


自适应卡发送的提交结果与常规用户文本略有不同。当用户在聊天中输入内容并发送普通消息时,最终会出现Context.Activity.Text。当用户在自适应卡上填写输入时,它最终会出现在Context.Activity.Value,这是一个对象,其中键名称是id在您的卡中,这些值是自适应卡中的字段值。

例如,json:

{
    "type": "AdaptiveCard",
    "body": [
        {
            "type": "TextBlock",
            "text": "Test Adaptive Card"
        },
        {
            "type": "ColumnSet",
            "columns": [
                {
                    "type": "Column",
                    "items": [
                        {
                            "type": "TextBlock",
                            "text": "Text:"
                        }
                    ],
                    "width": 20
                },
                {
                    "type": "Column",
                    "items": [
                        {
                            "type": "Input.Text",
                            "id": "userText",
                            "placeholder": "Enter Some Text"
                        }
                    ],
                    "width": 80
                }
            ]
        }
    ],
    "actions": [
        {
            "type": "Action.Submit",
            "title": "Submit"
        }
    ],
    "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
    "version": "1.0"
}

.. 创建一张如下所示的卡片:

Test Adaptive Card

如果用户在文本框中输入“测试测试 123”并单击“提交”,Context.Activity看起来像:

{ type: 'message',
  value: { userText: 'Testing Testing 123' },
  from: { id: 'xxxxxxxx-05d4-478a-9daa-9b18c79bb66b', name: 'User' },
  locale: '',
  channelData: { postback: true },
  channelId: 'emulator',
  conversation: { id: 'xxxxxxxx-182b-11e9-be61-091ac0e3a4ac|livechat' },
  id: 'xxxxxxxx-182b-11e9-ad8e-63b45e3ebfa7',
  localTimestamp: 2019-01-14T18:39:21.000Z,
  recipient: { id: '1', name: 'Bot', role: 'bot' },
  timestamp: 2019-01-14T18:39:21.773Z,
  serviceUrl: 'http://localhost:58453' }

用户提交的内容可见Context.Activity.Value.userText.

请注意,自适应卡提交作为回发发送,这意味着提交数据不会作为对话的一部分出现在聊天窗口中 - 它保留在自适应卡上。

使用自适应卡瀑布对话框

本质上,自适应卡不像提示那样工作。有提示时,将显示提示并等待用户输入,然后再继续。但是对于自适应卡(即使它包含输入框和提交按钮),自适应卡中没有代码会导致瀑布对话框在继续对话框之前等待用户输入。

因此,如果您使用接受用户输入的自适应卡,您通常希望处理用户在瀑布对话框上下文之外提交的任何内容。

话虽这么说,如果您想使用自适应卡作为瀑布对话框的一部分,有一个解决方法。基本上,你:

  1. 显示自适应卡
  2. 显示文本提示
  3. 将用户的自适应卡输入转换为文本提示的输入

在您的瀑布对话类中(步骤 1 和 2):

private async Task<DialogTurnResult> DisplayCardAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
    // Create the Adaptive Card
    var cardPath = Path.Combine(".", "AdaptiveCard.json");
    var cardJson = File.ReadAllText(cardPath);
    var cardAttachment = new Attachment()
    {
        ContentType = "application/vnd.microsoft.card.adaptive",
        Content = JsonConvert.DeserializeObject(cardJson),
    };

    // Create the text prompt
    var opts = new PromptOptions
    {
        Prompt = new Activity
        {
            Attachments = new List<Attachment>() { cardAttachment },
            Type = ActivityTypes.Message,
            Text = "waiting for user input...", // You can comment this out if you don't want to display any text. Still works.
        }
    };

    // Display a Text Prompt and wait for input
    return await stepContext.PromptAsync(nameof(TextPrompt), opts);
}

private async Task<DialogTurnResult> HandleResponseAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
    // Do something with step.result
    // Adaptive Card submissions are objects, so you likely need to JObject.Parse(step.result)
    await stepContext.Context.SendActivityAsync($"INPUT: {stepContext.Result}");
    return await stepContext.NextAsync();
}

在你的主机器人类中(<your-bot>.cs), 在下面OnTurnAsync(),靠近方法的开头,之前的某个地方await dialogContext.ContinueDialogAsync(cancellationToken)被称为(步骤 3):

var activity = turnContext.Activity;

if (string.IsNullOrWhiteSpace(activity.Text) && activity.Value != null)
{
    activity.Text = JsonConvert.SerializeObject(activity.Value);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在后续瀑布步骤中检索自适应卡的表单提交 的相关文章

  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • Android 代码使 imageView 圆形不起作用

    我正在努力让我的ImageView圆形的 我编写了以下代码以使其显示为圆形 但不知何故它仍然显示为方形ImageView 使用picasso获取图像 Java代码 ImageView iv ImageView addLinkDialog f
  • 如果客户端验证失败,如何隐藏 div(在客户端)?

    我正在制作一个带有 ASP NET 验证控件的 ASP NET 页面 如果验证失败 我想显示一个 div 在客户端 我在哪里做这个 我找不到访问客户端上的 OnValidate 事件的方法 我可以在服务器上执行此操作 但我宁愿在客户端上执行
  • 只是想知道 System.out.println()

    只是问我是否有正确的理解 System out println 系统是包 外面是班级 println 是方法 如果这是错误的 请告诉我正确的答案是什么 No System是一个类 它位于java lang包 这就是为什么你不需要导入它 ou
  • 隐藏爬虫的文本或div [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 假设我有一条短信 span class hide for real span h2 Obama is rocking the house h2 span class hide not
  • 如何从 UITableview 的选定行获取 cell.label.text 值?

    我是 iOS 应用程序开发新手 需要有关 UItableview 的帮助 当我用 json 数据填充表视图时 我也使用自定义的 Tableviewcell 我没有得到 lbluid 上选定单元格的 huid 值 lbluid 根据滚动显示
  • 在 EC2 上:未找到 sudo 节点命令,但没有 sudo 的节点是可以的

    我刚刚在新的 EC2 微型实例上安装了 nodejs 我正常安装了 configure gt make gt sudo make install Problem 当我在 ec2 user 下运行 node 时 它运行完美 当我运行 sudo
  • Java中“this”和“super”关键字的区别

    关键词有什么区别this and super 两者都用于访问类的构造函数 对吗 你们谁能解释一下吗 让我们考虑一下这种情况 class Animal void eat System out println animal eat class
  • 如何在透明矩形上绘制阴影?

    当我向矩形添加投影位图效果时 投影会考虑矩形的透明度 有意义 有没有办法在透明矩形上渲染阴影 就好像 矩形是不透明的 即出现的是一个带有阴影的矩形 洞 下面是带有阴影的透明矩形的 XAML 没有显示任何内容
  • memory.limit() 混淆:“不再支持 memory.limit()”

    当我写 memory limit 时 我收到以下 bug 消息 内存 limit 1 信息 警告信息 不再支持 memory limit 我需要的是增加内存大小 谢谢 看来这不是一个错误 在阅读版本 4 2 0 2022 04 22 提供的
  • 使用 pyspark 压缩后目录大小增加

    我使用 pyspark 编写了一个文件压缩器 它的工作方式是将目录的所有内容读取到 Spark 数据帧中 然后执行重新分区操作以减少文件数量 所需文件的数量由以下公式计算 directory size Wanted file size 我面
  • 在闭包中使用“this”

    我只是好奇 我应该如何在 jQuery 函数中使用 this 例如 如果我有这样的代码 headEl find form blog search input focus function this next span animate opa
  • 在 python 中打开文件时,我不断收到“标识符中的无效字符”

    所以我尝试使用以下代码打开一个文件 open datapickle rb as f names F approximate pickle load f However I constantly get 我能做什么来解决这个问题 请帮忙 两个
  • SQL语法错误

    CREATE TABLE users id INT UNSIGNED NOT NULL AUTO INCREMENT type ENUM member admin NOT NULL username VARCHAR 30 NOT NULL
  • VTK 帧缓冲区和 OpenCV Mat 数据之间的转换

    我正在 VTK 中可视化数据 我想获取渲染窗口的帧缓冲区并在 OpenCV 应用程序中显示它 我目前正在尝试通过以下方式 void aig VirtualScene Mat cv Mat m typedef unsigned char pi
  • C# 中的密码加密?

    如何在 C 中加密和解密密码 谢谢你的帮助 首先 您实际上并不打算将加密密码保存在任何地方 而是执行单向哈希 例如 SHA 存储该哈希值 然后 当您向用户询问其密码时 您将执行相同的哈希 如果新的哈希值与存储的哈希值匹配 则说明匹配 哈希和
  • 在 python 应用程序中导入 Google Cloud Bigquery api 模块时出错

    我正在尝试将 bigquery 导入到我的 python 应用程序中from google cloud import bigquery并使用 dev appserver py 在本地运行它 但我收到一个错误 File Volumes Bud
  • Linux 上的 CreateFile CREATE_NEW 等效项

    我编写了一个尝试创建文件的方法 不过 我设置了标志 CREATE NEW 因此它只能在它不存在时创建它 它看起来像这样 for handle CreateFileA filePath c str 0 0 NULL CREATE NEW FI
  • ServiceStack客户端添加附件

    我正在使用 ServiceStack ServiceClient Web XmlServiceClient 连接到 Web 服务 有没有办法在请求中添加附件 更多信息 我想做的是避免使用 Microsoft Web Services2 因为
  • Bootstrap-Sass:使用另一个变量覆盖变量

    我在我的一个项目中使用 Bootstrap sass 并且我想使用 Sass 变量对其进行自定义 当然 我创建了一个名为 variables scss 的新 scss 文件 并将其导入到 bootstrap sass 文件之前的主 scss
  • 如何在后续瀑布步骤中检索自适应卡的表单提交

    我正在使用 Bot Framework V4 并且我有一个包含两个步骤的 WaterfallDialog 第一步是捕获表单数据 第二步是处理表单数据 第一步发送回复 private async Task