如何将Prompt.Choice()的结果转发到当前对话框?

时间:2017-07-27 12:06:23

标签: c# botframework

我正在使用PromptDialog.Choice()向用户提供不同的选项。尝试次数设置为0,因此如果他们键入任何不是有效选项的内容,则不会有任何重试。

在这种情况下,我想将输入的文本传递给当前对话框,该对话框已提示提示并让它处理该消息。

这样做的正确方法是什么?我尝试在提示对话框的resume-handler中创建一个新活动,并直接调用MessageReceivedAsync()方法,但a)不能按预期工作,b)似乎是一个黑客。

一个例子是提示“我不确定你想做什么。显示帮助还是继续尝试?”有两个选项“帮助”和“继续尝试”。但是,如果用户现在输入“什么是一加一?”,我希望当前的对话框能够处理这个问题。

我也可以提出不同的问题:如何用另一个替换堆栈顶部的当前对话框?这样我就可以调用相同的对话框。

2 个答案:

答案 0 :(得分:2)

我认为调用MessageReceivedAsync将是这里的方式。关键是从您正在创建的活动中传递IAwaitable

代码应该是:

await MessageReceivedAsync(context, Awaitable.FromItem(yourActivity));

答案 1 :(得分:1)

Ezequiel Jadib回答中添加更多上下文。我遇到了类似下面链接中提到的问题的要求。另外,使用answer中的一个提供给同一个问题。

Calling back Luis from a forward dialog

虽然上述问题被标记为当前重复,但我觉得这个问题缺少路易斯上下文。

如果创建的Activity没有ChannelFromRecipient信息,则在创建回复时可能会出现一些异常。因此,下面的代码将帮助您创建正确的活动并在将其交给Luis之前设置正确的消息

Luis Intent Method

    [LuisIntent("PerformSearch")]
    public async Task Search(IDialogContext context, IAwaitable<IMessageActivity> activity, LuisResult result)
    {
        var msg = await activity;
        msg.Value = result;
        await context.Forward(new SearchDialog(), ResumeAfterSearchPerformed, msg, CancellationToken.None);

    }

恢复转发后的对话方法

    private async Task ResumeAfterSearchPerformed(IDialogContext context, IAwaitable<object> result)
    {

        var msg = await result;            
        var userSearchString = msg.ToString();
        if (userSearchString.Equals("searchCompleted", StringComparison.InvariantCultureIgnoreCase))
        {                
            context.Wait(MessageReceived);
        }
        else
        {
            // At this point send the message back to LUIS MessageReceived 
            // method to re-identify the intent and trigger the method
            Activity myActivity = (Activity)context.Activity;
            myActivity.Text = userSearchString;
            await MessageReceived(context, Awaitable.FromItem(myActivity));
        }
    }

通过以上操作,您可以轻松地从正确的水合Activity

创建回复
 Activity reply = ((Activity)message).CreateReply();
 reply.AttachmentLayout = AttachmentLayoutTypes.Carousel;