2017-07-27 3 views
2

Ich verwende PromptDialog.Choice(), um meinen Benutzern verschiedene Optionen zu präsentieren. Die Anzahl der Versuche ist auf 0 festgelegt. Wenn sie also etwas eingeben, das keine gültige Option ist, wird es keine Wiederholungen geben.Wie wird das Ergebnis von Prompt.Choice() an den aktuellen Dialog weitergeleitet?

In diesem Fall möchte ich den eingegebenen Text an den aktuellen Dialog übergeben, der sich vorgestellt hat, um die Nachricht zu bearbeiten.

Was ist der richtige Weg, dies zu tun? Ich habe versucht, eine neue Aktivität im Resume-Handler des Prompt-Dialogs zu erstellen und direkt die Methode MessageReceivedAsync() aufzurufen, aber das a) funktioniert nicht wie erwartet und b) scheint ein Hack zu sein.

Ein Beispiel wäre eine Eingabeaufforderung, die fragt: "Ich bin mir nicht sicher, was Sie tun möchten. Zeigen Sie Hilfe oder versuchen Sie es weiter?" mit zwei Optionen "Hilfe" und "Weiter versuchen". Wenn der Benutzer jetzt jedoch "Was ist eins plus eins?" Eingeben möchte, möchte ich, dass der aktuelle Dialog das übernimmt.

Ich könnte auch anders fragen: Wie kann ich den aktuellen Dialog oben auf dem Stapel durch einen anderen ersetzen? Dies würde mir erlauben, den gleichen Dialog aufzurufen.

Antwort

2

Ich denke, dass Anruf MessageReceivedAsync der Weg sein wird, hier zu gehen. Der Schlüssel besteht darin, eine IAwaitable aus der Aktivität zu übergeben, die Sie erstellen.

Der Code sollte wie:

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

Sieht so aus ... wenn ich mir die NodeJS-Beispiele anschaue, scheinen sie mehr Flexibilität in Bezug auf das Stack-Management zu bieten ... auch hier ist es mit NodeJS möglich: https://stackoverflow.com/questions/45334339/How-to-Pop-zu-Root-Dialog-mit-Bot-Framework – Krumelur

1

etwas mehr Kontext zu Ezequiel Jadib Antwort hinzufügen. Ich bin auf eine Anforderung gestoßen, die der im Link unten erwähnten Frage ähnlich ist. Auch verwendet eine der answer für die gleiche Frage zur Verfügung gestellt.

Calling back Luis from a forward dialog

Obwohl die obige Frage markiert als den aktuellen duplizieren, fühle ich mich der Luis Kontext dieser Frage fehlt.

Wenn die Activity ohne Channel erstellt wird, From und Recipient Informationen können Sie mit einigen Ausnahmen am Ende, während eine Antwort zu erstellen. Also, unter Code wird Ihnen helfen, die richtige Aktivität erstellen und die richtige Nachricht einstellen, bevor es über Luis

Luis Intent Methode

[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); 

    } 

Lebenslauf Nach dem Verfahren zur Weitergeleitete Dialog

Gabe
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)); 
     } 
    } 

Indem Sie oben tun, können Sie leicht eine Antwort von richtig hydratisiert Activity

erstellen
Verwandte Themen