【发布时间】:2018-10-22 19:53:07
【问题描述】:
我在 Bot Framework v4 中从一个对话框移动到另一个对话框时遇到了一些问题。我想要完成的是从对话 X 移动到 Y,然后从 Y 回到 X。
例如,我有一个 GetShoppingCart 对话框,我想切换到 FindRecipe 对话框。我尝试添加 FindRecipe 对话框
(dc.Dialogs.Add(FindRecipeDialog.Id, recipe_dialog);) 到 GetShoppingCart 的 瀑布,但只要我在 FindRecipe 对话框中执行相同操作,就会出现无限循环。
这很麻烦,因为我需要添加这一行才能访问对话框的目标 ID。否则被 Replace 方法调用时将无法识别(await dc.Replace(FindRecipeDialog.Id, dialogArgs);)。
然后我尝试将对话框对象从根对话框传递给 FindRecipe 和 GetShoppingCart 对话框,并在 GetShoppingCart 对话框中执行以下操作:
IDialog recipe_dialog = dialogs.Find(FindRecipeDialog.Id);
dc.Dialogs.Add(FindRecipeDialog.Id, recipe_dialog);
await dc.Replace(FindRecipeDialog.Id, dialogArgs);
有了这个,我能够成功进入 FindRecipe 对话框,而不会创建无限循环。 在 FindRecipe 对话框中,它执行第一个 watterfall 步骤:
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);
}
}
但是,在仅完成一种方法之后,它会返回到 GetShoppingCart 对话框,即使 FindRecipe 对话框中仍然存在瀑布步骤。在接下来的回合中,它会在尝试执行“context.Continue()”时抛出此异常;
{System.Exception: DialogSet.continue(): Can't continue dialog. A dialog with an id of 'FindRecipe' wasn't found. at Microsoft.Bot.Builder.Dialogs.DialogContext.Continue() at Microsoft.Bot.Builder.Dialogs.DialogContainer.DialogContinue(DialogContext dc) at Microsoft.Bot.Builder.Dialogs.DialogContext.Continue() at RecipeBot.RecipesBot.OnTurn(ITurnContext context) ... }
我是否需要在某个时候再次将 FindRecipe 对话框添加到 dc.Dialogs?
我在 dc.continue() 之前尝试过(抛出异常的地方),但在这种情况下它会抛出:
{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) ... }
【问题讨论】:
-
after finishing just one method, it goes back to the GetShoppingCart dialog, even though there are still waterfall steps left in the FindRecipe dialog.如果您可以提供可重现的示例或完整的实现,我们将测试并解决您的代码问题。
标签: botframework