在Microsoft Bot框架V4中完成子对话框后,如何在父对话框中继续?

时间:2019-02-22 17:17:27

标签: c# dialog botframework

简介

当前,我正在尝试使用Microsoft Bot Framework v4创建Bot Framework应用程序。

程序结构

我们当前有以下设置:

bot类的根名为:SubDialogBotBot

SubDialogBot中,我们创建了一个名为ParentDialog的新对话框。该对话框负责对特定的Intent做出反应。

然后我们从ParentDialog的{​​{1}}开始一个新对话框。该子对话框负责根据ChildDialog传递的参数向用户提出问题。

此问题完成后,我们要返回ParentDialog并继续进行操作。

在此示例中,我们要从各种不同的意图中重用ParentDialog,因为此处的代码完全相同。唯一改变的是必须向用户提出的问题。

问题

ChildDialog完成后,“流”将永远不会返回到ChildDialog

我们还尝试将ParentDialog ID设置为特定对象后再打开Dialog,然后使用ChildDialog中的Context.BeginDialog(....)进行调用。但是,因为显然该对话框是添加到ChildDialog而不是ParentDialog的,所以无法通过ID找到它。

Github存储库重现问题

https://github.com/devedse/SubDialogBotReproduction

1 个答案:

答案 0 :(得分:2)

首先,这是一个非常准备好的问题,谢谢您……特别是分享代码。

现在,好消息是我认为您的对话框没有问题。问题实际上出在your bot's OnTurnAsync中。您只会在BeginDialogAsync上呼叫ParentDialog。每个活动都会通过您的OnTurnAsync进入,这意味着您有责任处理重新进入对话框堆栈的过程。这意味着您需要检查一个活动对话框,如果有一个活动对话框,则需要致电ContinueDialogAsync才能从讨论中断的地方继续。这是您当前的OnTurnAsync,其中添加了额外的支票:

public async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken))
{
    // Create a dialog context
    var dc = await Dialogs.CreateContextAsync(turnContext);

    // Handle Message activity type, which is the main activity type for shown within a conversational interface

    // Message activities may contain text, speech, interactive cards, and binary or unknown attachments.

    // see https://aka.ms/about-bot-activity-message to learn more about the message and other activity types

    if (turnContext.Activity.Type == ActivityTypes.Message)
    {
        // If there's no active dialog, begin the parent dialog
        if(dc.ActivDialog == null)
        {
           await dc.BeginDialogAsync(nameof(ParentDialog));
        }
        else
        {
           await dc.ContinueDialogAsync();
        }


        // Save the new turn count into the conversation state.
        await _accessors.ConversationState.SaveChangesAsync(turnContext);
    }
    else
    {

        await turnContext.SendActivityAsync($"{turnContext.Activity.Type} event detected");
    }
}