2017-07-27 36 views
2

我正在使用PromptDialog.Choice()向我的用户展示不同的选项。尝试次数设置为0,因此如果他们键入的任何内容不是有效选项,则不会有任何重试次数。如何将Prompt.Choice()的结果转发到当前对话框?

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

这样做的正确方法是什么?我试图在提示对话框的恢复处理程序中创建一个新的活动,并直接调用MessageReceivedAsync()方法,但a)未按预期工作,并且b)似乎是一种破解。

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

我也可以以不同的方式提出问题:如何将堆栈顶部的当前对话框替换为另一个对话框?这将允许我只调用同一个对话框。

回答

2

我认为调用MessageReceivedAsync将是这里的方法。关键是要通过您正在创建的活动中的IAwaitable

的代码应该是这样的:

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

看起来像......每当我检查出NodeJS的例子,它们似乎提供了更多的关于堆栈管理的灵活性......这里也可以用NodeJS来实现它:https://stackoverflow.com/questions/45334339 /如何到流行到根对话与 - BOT框架 – Krumelur

1

添加一些上下文Ezequiel Jadib答案。我遇到了类似于下面链接中提到的问题的要求。另外,使用提供给相同问题的answer之一。

Calling back Luis from a forward dialog

虽然上述问题被标记为复制到目前,我觉得路易斯上下文从这个问题缺少。

如果Activity而不ChannelFromRecipient信息创建的,你可以在创建回复一些例外结束。所以,下面的代码将帮助您创建正确的活动,并移交到路易斯

路易斯意向方法

[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; 
相关问题