如何将Prompt.Choice()的结果转发到当前对话框?
我正在使用PromptDialog.Choice()
向我的用户提供不同的选项。 尝试次数设置为0,因此如果他们键入任何不是有效选项的内容,则不会进行任何重试。
在这种情况下,我想将输入的文本传递给当前对话框,该对话框已提示提示并让它处理该消息。
这样做的正确方法是什么? 我尝试在提示对话框的resume-handler中创建一个新活动,并直接调用MessageReceivedAsync()
方法,但a)不能按预期工作,b)似乎是一个hack。
一个例子是提示“我不确定你想做什么。显示帮助还是继续尝试?” 有两个选项“帮助”和“继续尝试”。 但是,如果用户现在输入“什么是一加一?”,我希望当前的对话框能够处理这个问题。
我也可以提出不同的问题:如何用另一个替换堆栈顶部的当前对话框? 这将允许我只调用相同的对话框。
我认为调用MessageReceivedAsync
将是这里的方法。 关键是从您正在创建的活动中传递IAwaitable
。
代码应该是:
await MessageReceivedAsync(context, Awaitable.FromItem(yourActivity));
为Ezequiel Jadib答案添加更多上下文。 我遇到了类似于下面链接中提到的问题的要求。 另外,使用了提供给同一个问题的答案之一。
从前进对话框中回拨Luis
虽然上面的问题被标记为当前重复,但我觉得这个问题缺少Luis上下文。
如果创建的Activity
没有Channel
, From
和Recipient
信息,则在创建回复时可能会出现一些exception。 因此,下面的代码将帮助您创建正确的活动并在将其交给Luis之前设置正确的消息
路易斯意图方法
[LuisIntent("PerformSearch")] public async Task Search(IDialogContext context, IAwaitable 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
通过上面的操作,您可以轻松地从正确的水合Activity
创建回复
Activity reply = ((Activity)message).CreateReply(); reply.AttachmentLayout = AttachmentLayoutTypes.Carousel;