Botframework 无法在Bot Framework v4中的对话框之间切换
在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对话框中,它执行第一个功率下降步骤:Botframework 无法在Bot Framework v4中的对话框之间切换,botframework,Botframework,在botframeworkv4中,我在从一个对话框切换到另一个对话框时遇到一些问题。我想完成的是从对话X移动到Y,然后从Y返回到X 例如,我有一个GetShoppingCart对话框,我想切换到FindRecipe对话框。我已尝试添加FindRecipe对话框 dc.Dialogs.AddFindRecipeDialog.Id,配方对话框;到GetShoppingCart的瀑布,但只要我在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);