如果用户想要停止,请退出当前对话框

时间:2018-05-09 12:24:06

标签: frameworks bots luis mbf

我正在使用多个对话框。有些使用formbuilder,有些使用ResultAfter方法来自定义提示值。我想要一种方法来检查退出单词上的消息,例如停止,退出等。

我认为StartAsync功能将是一个良好的开端。看到所有对话都是从我的RootDialog转发的,我已经在RootDialog中实现了这个:

    public override async Task StartAsync(IDialogContext context)
    {
        string[] stopStrings = { "quit", "cancel", "exit" };
        var msg = context.Activity.AsMessageActivity().Text;
        if (stopStrings.Any(msg.Contains))
        {
            await context.PostAsync("You cancelled.");
            context.Done(true);
        }
        else
        {
            context.Wait(this.MessageReceived);
        }
    }

当我要求机器人停止"它成功告诉我,我取消了。但是在我发送的下一条消息中,我收到了这个错误:

Exception thrown: 'System.Collections.Generic.KeyNotFoundException'

在我的MessageController中的这一行:

await Conversation.SendAsync(activity, () => new RootDialog());

现在我不确定找不到什么钥匙,为什么它给我这个。感谢帮助!

1 个答案:

答案 0 :(得分:1)

通常,当有人想要完成这样的事情,例如要取消的关键字时,他们会使用scorables。 Scorables是全局消息处理程序,因此如果您设置的关键字触发了一个,则在触发正常的对话流之前会对其进行处理。有一些很好的资源可供this blogthis video之类的可能让您入门。

我实际上无法重现此错误,但这里有一些提示和想法。我认为我从来没有见过有人在StartAsync中提出逻辑并按照他们的预期行事。当我尝试你的代码时,我无法弄清楚为什么你会以你的方式覆盖它。逻辑应该在MessageReceivedAsync。尝试将您的逻辑移到MessageReceivedAsync方法中。如果你绝对想要这样做的另一件事就是它只用context.Wait(this.MessageReceivedAsync);替换context.Done(true),因为你仍然在RootDialog,消息只会从消息路由到那里控制器,你不需要手动操作对话框堆栈,虽然我不知道你的项目的结构,所以我可能是错的。