[BotFramework]:如何在瀑布式对话框中捕获/提取通过C#Web聊天机器人中呈现的自适应卡提交的值?

[BotFramework]:如何在瀑布式对话框中捕获/提取通过C#Web聊天机器人中呈现的自适应卡提交的值?,c#,botframework,bots,chatbot,C#,Botframework,Bots,Chatbot,我使用SDK 4在C#中创建了聊天机器人,该SDK有多个对话框,每个对话框调用另一个对话框,在一个对话框中,我在步骤#1中渲染自适应卡,该对话框只有两个输入,并提供OK按钮: 1.日期 2.时间 3.OK按钮 这样我就可以提取/捕获通过步骤2中的OK按钮提交的值,并继续该过程 问题:如何在C#中的瀑布式对话框中提取在步骤#1和步骤#2中提交的值 语言:C# botsdk:V4 请帮助我,因为我是新的机器人和编码提供一步一步的指导 我已经尝试过以下几种方法: 1.将呈现的卡片放入提示中 2.尝试通

我使用SDK 4在C#中创建了聊天机器人,该SDK有多个对话框,每个对话框调用另一个对话框,在一个对话框中,我在步骤#1中渲染自适应卡,该对话框只有两个输入,并提供OK按钮: 1.日期 2.时间 3.OK按钮 这样我就可以提取/捕获通过步骤2中的OK按钮提交的值,并继续该过程

问题:如何在C#中的瀑布式对话框中提取在步骤#1和步骤#2中提交的值

语言:C#

botsdk:V4

请帮助我,因为我是新的机器人和编码提供一步一步的指导

我已经尝试过以下几种方法: 1.将呈现的卡片放入提示中 2.尝试通过以下方式提取/捕获价值: stepContext.Context.Activity.Value

所有这些都无济于事

第1步:
var cardAttachment=CreateAdaptiveCardAttachment(this.cards)
var reply=stepContext.Context.Activity.CreateReply()
reply.Attachments=newlist(){cardAttachment}
返回wait-stepContext.Context.SendActivityAsync(reply)
//或
return await stepContext.PromptAsync(“datetextPrompt”),new PromptOptions()
{
Prompt=reply,
})

第2步:
我想提取或捕获价值?如何操作?

使用带有的自适应卡

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

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

也就是说,如果您想将自适应卡用作瀑布式对话框的一部分,那么有一种解决方法。基本上,你:

  • 显示自适应卡
  • 显示文本提示
  • 将用户的自适应卡输入转换为文本提示输入
  • 在瀑布式对话框类中(步骤1和2):

    附加上下文 自适应卡发送的提交结果与常规用户文本略有不同。当用户在聊天中键入内容并发送正常消息时,它会在
    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"
    }
    
    。。创建一张如下所示的卡:

    如果用户在文本框中输入“Testing 123”并点击Submit,
    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
    中看到


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

    瀑布式对话框中还不支持自适应卡。这是此请求的[GitHub问题]()跟踪。有一些解决方案涉及到创建您自己的卡片提示符,例如一个display[here]()@EdBoykin澄清:瀑布对话框中绝对支持自适应卡片。它们目前不能用作提示,因为这不是它们的初衷。但是,它们仍然可以显示出来。我同意。我应该更清楚地说明我的话。我感谢你的澄清。谢谢Richardson,但是因为我对编码和机器人有点陌生,你能告诉我以下内容吗?1.如何获取/如何获取此方法在var reply=wait stepContext.Context.Activity.GetReplyFromCardAsync(“BusinessyForm”)中为GetReplyFromCardAsync;当我尝试这个时,我没有得到方法?2.我们在方法GetReplyFromCardAsync中传递的值“BusinessyForm”是多少"? 自适应卡是json文件吗?3.GetReplyFromCardAsync方法做什么?如何使用Context.Activity访问它?@ChaitanyaNG我道歉。我复制/粘贴了我以前提供的另一个答案的答案,但没有仔细校对。这种方法是他们代码特有的。相反,请使用
    stepContext.Context.Activity.CreateReply()
    ,我已将其编辑到我的回答中。我为我在休假期间未能及时回复而道歉。我已经厌倦了你在《落水》对话中的解释:1。步骤1:我编写了显示自适应卡的代码,即显示自适应卡2。步骤2:如下所述:等待stepContext.Context.SendActivityAsync($“输入:{stepContext.Result}”);返回wait-stepContext.NextAsync();3.然后在初始化对话框上下文后的OnTurnSync方法中编写回发活动的代码。但是运气不好,还是一样的问题。请帮忙。@ChaitanyaNG没问题。你能用你的代码编辑你的问题吗?这将帮助我了解出了什么问题。或者,如果你可以发布一个链接到你的回购协议,那也行。嗨,理查森,再次感谢你的时间。我已经在下面的GIT Repo中将我的解决方案上传到ZIP文件中:如果您对该文件有任何问题,请告诉我。如果我的代码有任何错误,请一步一步地指导我。再次感谢你的帮助。
    { 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' }