Botframework 无法在Bot Framework v4中的对话框之间切换

Botframework 无法在Bot Framework v4中的对话框之间切换,botframework,Botframework,在botframeworkv4中,我在从一个对话框切换到另一个对话框时遇到一些问题。我想完成的是从对话X移动到Y,然后从Y返回到X 例如,我有一个GetShoppingCart对话框,我想切换到FindRecipe对话框。我已尝试添加FindRecipe对话框 dc.Dialogs.AddFindRecipeDialog.Id,配方对话框;到GetShoppingCart的瀑布,但只要我在FindRecipe对话框中做同样的事情,就会有一个无限循环。 这很麻烦,因为我需要添加此行才能访问对话框的

在botframeworkv4中,我在从一个对话框切换到另一个对话框时遇到一些问题。我想完成的是从对话X移动到Y,然后从Y返回到X

例如,我有一个GetShoppingCart对话框,我想切换到FindRecipe对话框。我已尝试添加FindRecipe对话框 dc.Dialogs.AddFindRecipeDialog.Id,配方对话框;到GetShoppingCart的瀑布,但只要我在FindRecipe对话框中做同样的事情,就会有一个无限循环。 这很麻烦,因为我需要添加此行才能访问对话框的目标id。否则,当替换方法wait dc.ReplaceFindRecipeDialog.id,dialogArgs;调用它时,它将不会被重新识别

然后,我尝试将dialogs对象从根对话框传递到FindRecipe和GetShoppingCart对话框,并在GetShoppingCart对话框中执行以下操作:

有了它,我就能够成功地进入FindRecipe对话框,而无需创建无限循环。 在FindRecipe对话框中,它执行第一个功率下降步骤:

async(dc, args, next) =>
{
    UserStateObject newUserStateObject;
    var userState = UserState<UserState>.Get(dc.Context);
    UserStateObject userStateObject = JsonConvert.DeserializeObject<UserStateObject>(userState.UserStateObject);
    if (args == null) {
        await FindRecipe(dc);
    } else {
        newUserStateObject = args["userState"] as UserStateObject;
        if(newUserStateObject.UserInputs.UserRecipeChoices == RecipeUserChoicesEnum.AddAnotherProductChoice) 
            await AddOtherProductChoice(dc, userStateObject);
    }
}
是否需要在某个时候再次将FindRecipe对话框添加到dc.Dialogs

我在dc之前就尝试过。在引发异常的位置继续,但在本例中,它会引发:

{System.Exception: DialogSet.add(): A dialog with an id of 'FindRecipe' already added.   at Microsoft.Bot.Builder.Dialogs.DialogSet.Add(String dialogId, IDialog dialog)   at RecipeBot.RecipesBot.OnTurn(ITurnContext context) ... }

我能够解决这个问题

每次收到消息时,我都会创建一个新的对话,这导致了问题:

 dialogs = new DialogSet();
 dialogs.Add(GetShoppingCartDialog.Id, new GetShoppingCartDialog());
 dialogs.Add(FindRecipeDialog.Id, new FindRecipeDialog());
为了解决这个问题,我使用了一个单例:创建了每个对话框的一个实例,并将其保存为对话框的一个变量

 dialogs = new DialogSet();
 dialogs.Add(GetShoppingCartDialog.Id, GetShoppingCartDialog.Instance);
 dialogs.Add(FindRecipeDialog.Id, FindRecipeDialog.Instance);

在完成一个方法之后,它返回到GetShoppingCart对话框,尽管FindRecipe对话框中仍然有瀑布式的步骤。如果您可以提供一个可复制的示例或完整的实现,我们将测试并排除代码中的问题。我没有看到Dialogset.add方法有两个参数-现在只有dialog是参数
 dialogs = new DialogSet();
 dialogs.Add(GetShoppingCartDialog.Id, new GetShoppingCartDialog());
 dialogs.Add(FindRecipeDialog.Id, new FindRecipeDialog());
 dialogs = new DialogSet();
 dialogs.Add(GetShoppingCartDialog.Id, GetShoppingCartDialog.Instance);
 dialogs.Add(FindRecipeDialog.Id, FindRecipeDialog.Instance);