【问题标题】:Bot builder : Adaptive cards - call a method when submitting机器人生成器:自适应卡片 - 提交时调用方法
【发布时间】:2018-10-17 00:24:37
【问题描述】:

我需要创建一个用户必须填写并发送的表单。所以我必须创建一个调用另一个方法的提交按钮,但我找不到提交操作和调用另一个方法之间的链接。

我的表单脚本是:

public Attachment CreateAdaptiveCardwithEntry()
        {
            var submitActionData = JObject.Parse("{ \"Type\": \"SaveFunction\" }");
            var card = new AdaptiveCard()
            {

                Body = new List<CardElement>()
                {  
                    // Hotels Search form  

                    new TextBlock() { Text = "Titre de la note des frais" },
                    new TextInput()
                    {
                        Id = "titre",
                        Speak = "<s>Veuillez saisir le titre</s>",
                        Placeholder = "Veuillez saisir le titre",
                        Style = TextInputStyle.Text
                    },

                },

                Actions = new List<ActionBase>()
                {
                    new SubmitAction()
                    {
                       DataJson = submitActionData.ToString()

                    }
                }
            };

我卡的脚本是:

    var replyMessage = context.MakeMessage();
    replyMessage.Attachments = new List<Attachment> { FraisDialog.CreateAdaptiveCardwithEntry() };
    await context.PostAsync(replyMessage, CancellationToken.None);
    context.Wait(MessageReceived);

MessageReceivedAsync 中的脚本是:

public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
        {
            var message = await result;

            if (message.Value != null)
            {
                // Got an Action Submit
                dynamic value = message.Value;
                string submitType = value.Type.ToString();
                switch (submitType)
                {
                    case "SaveFunction":
                        await context.PostAsync("Please complete all the search parameters:\n");
                        return;
                }
            }
        }

在此示例中,我需要使用 Id = "titre" 发送信息并随后对其进行处理,我不知道如何发送它(DataJson ?)和哪里(MessageReceivedAsync ?)。有人能帮我吗 ?我需要为卡创建另一个对话框吗?

Ps : 所有这些代码都在 rootDialog 中。

【问题讨论】:

  • 您只想处理自适应卡片中输入的字段?
  • 是的,这就是我想要的,但我无法触发提交操作。你能告诉我怎么做吗?
  • 触发提交操作是什么意思?您没有收到“请完成所有搜索参数”的消息吗?
  • 这正是我的问题所在,我没有收到“请完成所有搜索参数”消息,而是收到“抱歉,我的机器人代码有问题”,即 500内部服务器错误。

标签: azure botframework form-submit adaptive-cards


【解决方案1】:

我没有收到消息“请完成所有搜索参数”

如果您的所有代码都在 RootDialog 中,请使用 context.Wait(MessageReceivedAsync);发送附件后。

我需要发送带有 Id = "titre" 的信息并在之后处理它

当点击提交按钮时,表单数据像往常一样被发送到 MessageReceived 方法。如果您只想访问自适应卡中的字段,您可以访问动态变量值。这是一个例子。

var message = await result;

if (message.Value != null)
{
    // Got an Action Submit
    dynamic value = message.Value;
    string submitType = value.Type.ToString();
    switch (submitType)
    {
        case "SaveFunction":
            if(value.titre == "")
            {
                await context.PostAsync("Please complete all the search parameters:\n");
            }
            else
            {
                await context.PostAsync($"You entered {value.titre}");
            }
            return;
    }
}

【讨论】:

  • 我已经使用了 context.Wait(MessageReceivedAsync);按照我上面的代码中的说明发送我的附件后。就好像 MessageReceivedAsync 方法从未被调用过,我已经在那里设置了一个断点,但它从未被击中。您是否认为由于对话框而导致的问题是 LuisDialog 而不是常规 Dialog ?因为我之前从未在 LuisDialog 中见过 MessageReceivedAsync 方法。
  • 路易斯对话?您没有指定有关 Luis Dialog 的任何内容,并且您提到所有内容都在 Root Dialog 中? Luis Dialogs 没有 MessageRecievedAsync。请用您的问题的详细信息更改您的问题。
  • 好的,谢谢,我会改的。所以为了确认我们不能在 Luis 对话框中触发提交操作,我们只需要创建另一个对话框来管理自适应卡片?
  • 尝试使用根对话框并转发到带有 Context.Forward 的 LUIS 对话框,这样您就可以在点击 LUIS 之前根据需要操作 valueactivity
猜你喜欢
  • 2018-10-17
  • 2020-04-11
  • 2019-04-22
  • 2021-03-24
  • 2021-05-01
  • 2020-09-28
  • 2019-12-03
  • 2020-11-14
  • 1970-01-01
相关资源
最近更新 更多