[BotFramework]:如何在瀑布对话框中捕获/提取通过C#Web聊天bot中呈现的Adaptive卡提交的值? [英] [BotFramework]: How to capture/extract the values submitted through Adaptive card rendered in C# Web Chat bot in a waterfall dialog?

查看:51
本文介绍了[BotFramework]:如何在瀑布对话框中捕获/提取通过C#Web聊天bot中呈现的Adaptive卡提交的值?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用C#使用SDK 4在C#中创建了聊天机器人,该聊天机器人具有多个对话框,每个对话框都调用另一个对话框,在一个对话框中,我正在STEP#1中渲染自适应卡,该卡只有2个输入,并带有确定"按钮: 1.日期 2.时间 3.确定按钮 这样我就可以提取/捕获通过STEP#2中的确定"按钮提交的值,然后继续进行处理.

I have chatbot created in C# using SDK 4 which has multiple dialog's each dialog calls another, in one dialog i am rendering Adaptive card in STEP #1 which is having only 2 inputs be provided with OK button: 1. Date 2. Time 3. OK Button So that i can take the extract/captures the values submitted through OK button in STEP#2 and continue with process.

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

Issue: How to extract the values that has been submitted in step#1 in STEP#2 in an waterfall dialog in C#?

语言:C#

Bot SDK:V4

Bot SDK: V4

请提供逐步指南,以帮助我成为BOT和编码新手?

Please help as i am new to BOT and coding by providing step by step guide?

我已经尝试了一些方法,例如: 1.将呈现的卡片放在提示中 2.尝试通过以下方式提取/获取价值: stepContext.Context.Activity.Value

I have already tried few things like: 1. Putting the card rendered in prompt 2. Try to extract/capture value through: stepContext.Context.Activity.Value

所有这些都无济于事.

步骤1: var cardAttachment = CreateAdaptiveCardAttachment(this.cards); var reply = stepContext.Context.Activity.CreateReply(); reply.Attachments = new List<Attachment>() { cardAttachment }; return await stepContext.Context.SendActivityAsync(reply); //或者 return await stepContext.PromptAsync("datetextPrompt", new PromptOptions() { Prompt = reply, });

STEP #1: var cardAttachment = CreateAdaptiveCardAttachment(this.cards); var reply = stepContext.Context.Activity.CreateReply(); reply.Attachments = new List<Attachment>() { cardAttachment }; return await stepContext.Context.SendActivityAsync(reply); // or return await stepContext.PromptAsync("datetextPrompt", new PromptOptions() { Prompt = reply, });

步骤2: 我想提取或获取价值?怎么做?

STEP #2: I want to extract or capture value? How to do it?

推荐答案

将自适应卡与

Using Adaptive Cards with Waterfall Dialogs

从本质上讲,自适应卡不能像提示一样工作.带有提示,提示将显示并等待用户输入,然后继续.但是对于自适应卡(即使它包含一个输入框和一个提交按钮),自适应卡中也没有代码,这会使瀑布对话框在继续对话框之前先等待用户输入.

Natively, Adaptive Cards don't work like prompts. With a prompt, the prompt will display and wait for user input before continuing. But with Adaptive Cards (even if it contains an input box and a submit button), there is no code in an Adaptive Card that will cause a Waterfall Dialog to wait for user input before continuing the dialog.

因此,如果您使用的是接受用户输入的自适应卡,则通常要处理用户在瀑布对话框"上下文之外提交的所有内容.

So, if you're using an Adaptive Card that takes user input, you generally want to handle whatever the user submits outside of the context of a Waterfall Dialog.

话虽如此,如果您想在瀑布对话框中使用自适应卡,则有一种解决方法.基本上,您:

That being said, if you want to use an Adaptive Card as part of a Waterfall Dialog, there is a workaround. Basically, you:

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

在瀑布对话框"类中(步骤1和2):

In your Waterfall Dialog class (steps 1 and 2):

    private async Task<DialogTurnResult> DisplayCardAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
    {
        // Display 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),
        };
        var message = MessageFactory.Text("");
        message.Attachments = new List<Attachment>() { cardAttachment };
        await stepContext.Context.SendActivityAsync(message, cancellationToken);

        // Create the text prompt
        var opts = new PromptOptions
        {
            Prompt = new Activity
            {
                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();
    }

在您的主要bot类(<your-bot>.cs)中的OnTurnAsync()下,靠近方法开头的位置,称为await dialogContext.ContinueDialogAsync(cancellationToken)之前的某个位置(第3步):

In your main bot class (<your-bot>.cs), under OnTurnAsync(), near the beginning of the method, somewhere before await dialogContext.ContinueDialogAsync(cancellationToken) is called (step 3):

var activity = turnContext.Activity;

if (string.IsNullOrWhiteSpace(activity.Text) && activity.Value != null)
{
    activity.Text = JsonConvert.SerializeObject(activity.Value);
}

其他上下文

自适应卡发送的提交"结果与常规用户文本略有不同.当用户键入聊天并发送正常消息时,它最终以Context.Activity.Text结尾.当用户填写自适应卡上的输入时,它会以Context.Activity.Value结尾,该对象的键名是卡中的id,值是自适应卡中的字段值.

Additional Context

Adaptive Cards send their Submit results a little different than regular user text. When a user types in the chat and sends a normal message, it ends up in Context.Activity.Text. When a user fills out an input on an Adaptive Card, it ends up in Context.Activity.Value, which is an object where the key names are the id in your card and the values are the field values in the adaptive card.

例如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"
}

..创建一张看起来像这样的卡片:

.. creates a card that looks like:

如果用户在文本框中输入"Testing Testing 123",然后单击Submit,则Context.Activity将类似于:

If a user enters "Testing Testing 123" in the text box and hits Submit, Context.Activity will look something like:

{ 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中看到用户提交的内容.

The user submission can be seen in Context.Activity.Value.userText.

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

Note that adaptive card submissions are sent as a postBack, which means that the submission data doesn't appear in the chat window as part of the conversation--it stays on the Adaptive Card.

这篇关于[BotFramework]:如何在瀑布对话框中捕获/提取通过C#Web聊天bot中呈现的Adaptive卡提交的值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆