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; 
相關問題