在Microsoft Bot Framework中实现PromptDialog.Choice的退出功能
如何在Microsoft Bot Framework中退出PromptDialog.Choice流程?
我懂你现在的困扰——在使用PromptDialog.Choice时,用户选择退出选项后,用context.Quit()报错,不知道该怎么正确退出这个Prompt流程对吧?
其实问题出在context.Quit()的用途上:它是用来终止整个机器人对话会话的,不是退出单个对话框流程,所以在这个场景下调用它肯定会出问题。我们需要的是结束当前的Prompt对话框,回到之前的对话上下文,或者直接结束这个分支流程。
这里给你两种适配不同场景的正确实现方式:
1. 回到父对话框(推荐)
如果你的Prompt是被父对话框调用的,想要退出后回到父对话框的逻辑里,直接用context.Done()即可。这个方法会结束当前对话框,并可以返回一个值给父对话框的Resume方法:
case GobackOption: // 结束当前Prompt对话框,返回null表示用户选择了退出 await context.Done<string>(null); break;
然后你需要在父对话框的ResumeAfterOptionDialog方法里处理这个返回值,比如:
private async Task ResumeAfterOptionDialog(IDialogContext context, IAwaitable<object> result) { var response = await result; if (response == null) { // 用户选择退出,这里可以发送提示并回到主菜单或其他逻辑 await context.PostAsync("已退出预订选择流程,有其他需求随时喊我!"); // 比如回到主菜单对话框 // context.Call(new MainMenuDialog(), ResumeAfterMainMenu); } else { // 处理其他业务对话框返回的结果 await context.PostAsync("搞定你的预订操作啦!"); } }
2. 直接结束整个对话会话
如果你的场景是用户选择退出后要直接终止整个机器人对话(而不是回到父流程),可以用EndConversationAsync:
case GobackOption: // 直接结束整个对话会话 await context.EndConversationAsync(); break;
这个方法会彻底结束当前会话,适合用户明确表示要结束和机器人的所有交互的场景。
总结一下:退出单个Prompt流程优先用context.Done(),它能让对话流程平滑回到上一级;只有需要彻底结束整个对话时才用EndConversationAsync,别再用context.Quit()啦!
内容的提问来源于stack exchange,提问作者Ronak Shetiya
相关产品推荐
相关产品推荐

