首页 > 解决方案 > 在 Microsoft Bot Framework 中取消或退出 PromptDialog.Choice 流

问题描述

我有一个带有 4 个选项的提示,最后一个选项是用户可以退出提示,我想实现一些代码以便机器人退出提示

图片

   PromptDialog.Choice(context, this.OnOptionSelected, new List<string>() { FlightsOption, HotelsOption, TrainOption, GobackOption }, "Sure..! Tell me what booking would like to make..?", "Not a valid option", 3);

在上图中,我已经实现了退出选项,如果用户选择退出,它将转到切换退出的情况。

我也尝试过 context.quit 但它会引发错误

private async Task OnOptionSelected(IDialogContext context, IAwaitable<string> result)
    {
        try
        {
            string optionSelected = await result;

            switch (optionSelected)
            {
                case FlightsOption:
                    context.Call(new FlightDialog(), this.ResumeAfterOptionDialog);
                    break;

                case HotelsOption:
                    context.Call(new HotelsDialog(), this.ResumeAfterOptionDialog);
                    break;
                case TrainOption:
                    context.Call(new TrainDialog(), this.ResumeAfterOptionDialog);
                    break;
                case GobackOption:
                    //want some code here to quit the form
                    break;


            }
        }

标签: frameworksbotframeworkbots

解决方案


首先,这不是表单流。这是及时的。现在您可以执行类似的操作,或者像这样从堆栈中退出对话框

try
        {
            string optionSelected = await result;

            switch (optionSelected)
            {
                case FlightsOption:
                    context.Call(new FlightDialog(), this.ResumeAfterOptionDialog);
                    break;

                case HotelsOption:
                    context.Call(new HotelsDialog(), this.ResumeAfterOptionDialog);
                    break;
                case TrainOption:
                    context.Call(new TrainDialog(), this.ResumeAfterOptionDialog);
                    break;
                case GobackOption:
                    context.Done<object>(null);
                    break;


            }
        }

或者,你可以告诉一些事情,然后在同一个对话框中等待其他消息,就像这样

 try
    {
        string optionSelected = await result;

        switch (optionSelected)
        {
            case FlightsOption:
                context.Call(new FlightDialog(), this.ResumeAfterOptionDialog);
                break;

            case HotelsOption:
                context.Call(new HotelsDialog(), this.ResumeAfterOptionDialog);
                break;
            case TrainOption:
                context.Call(new TrainDialog(), this.ResumeAfterOptionDialog);
                break;
            case GobackOption:
            await context.PostAsync("Ok, you came back. Now tell something new.");
            context.Wait(MessageReceivedAsync);
            break;
        }
    }

下一条消息会在这里

public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
        {
            var message = await result;
            context.Wait(MessageReceivedAsync);
        }

推荐阅读