2017-05-18 2 views
2

Ich entwerfe einen Bot, der eine Datenbank abfragt, aber ich habe eine Wand getroffen.Eine Schleife in einem C# Botframework erstellen

[LuisIntent("ProjectInfo")] 
     public async Task projectInfo(IDialogContext context, LuisResult result) 
     { 
      PromptDialog.Text(context,AfterPromptMethod,"Please enter your project name", attempts: 100); 
     } 
     async Task AfterPromptMethod(IDialogContext context, IAwaitable<string> userInput) 
     { 
      var InputText = await userInput; 
      string projectName = InputText.ToString(); 
      if (projectName!= null) 
      { 
       TestInfo MI = new TestInfo(); 
       if (MI.FindProject(projectName) == 0) 
       { 
        await context.PostAsync($"Project Found. What do you want to know ?"); 
       } 
       else 
       { 
//PromptDialog.Text(context,AfterPromptMethod,"Pleaase check your product name and try again", attempts: 100); 
        await context.PostAsync($"Project Not Found. Check your project name and try again."); 

       } 
      } 
      context.Wait(MessageReceived); 
     } 

Dies ist, wo ich die Schleife setzen möchte, Projektinfo in Ordnung genannt wird, aber wenn es die if-Anweisung erreicht, an dem Projekt nicht gefunden, es tut nichts. Ich habe versucht, "context.Wait (projectInfo)" einzufügen, aber es hat nicht geholfen. Ich habe auch versucht, den Prompt-Dialog zu verwenden, wenn ja, springt es zurück, wenn es nicht zum Hauptmenü geht. Aber ich war nicht in der Lage, meinen Kopf um diesen Ansatz zu wickeln.

Wenn jemand irgendwelche Vorschläge oder bessere Möglichkeiten hat, dies zu tun, würden sie geschätzt werden.

Antwort

3

Wenn das, was Sie wollen wieder auf die Projektinfo Methode zu gehen, dann rufen Sie einfach an :)

I aktualisiert Code

[LuisIntent("ProjectInfo")] 
public async Task projectInfo(IDialogContext context, LuisResult result) 
{ 
    PromptDialog.Text(context,AfterPromptMethod,"Please enter your project name", attempts: 100); 
} 

async Task AfterPromptMethod(IDialogContext context, IAwaitable<string> userInput) 
{ 
    var InputText = await userInput; 
    string projectName = InputText.ToString(); 
    if (projectName!= null) 
    { 
     TestInfo MI = new TestInfo(); 
     if (MI.FindProject(projectName) == 0) 
     { 
      await context.PostAsync($"Project Found. What do you want to know ?"); 
      context.Wait(MessageReceived); 
     } 
     else 
     { 
      await context.PostAsync($"Project Not Found. Check your project name and try again."); 
      await this.projectInfo(context, null); 
     } 
    } 
} 
0

Das Problem ist context.Wait(..). Wenn der PromptDialog getroffen wird, wird ein anderer Dialog erstellt und dieser Dialog wird die Eingabeaufforderung behandeln. Die Codeausführung in dieser Methode wird jedoch nicht einfach dort beendet. Es geht weiter bis zum Ende der Methode und das nächste, was es trifft, ist die context.wait(MessageRecieved). Diese Zeile versucht anzugeben, dass die nächste Nachricht in der MessageRecieved-Methode behandelt werden soll. Also hast du 2 Plätze die nächste Nachricht wird erwartet und das kann nicht sein.

Um Ihr Problem zu lösen, fügen Sie direkt nach Ihrem PromptDialog eine return; hinzu. Dadurch wird sichergestellt, dass context.wait (..) nicht getroffen wird.

+0

Würde der Rückkehr; zurück zur projectInfo springen? oder einfach stoppen Sie es den Kontext zu erreichen. Warten Sie – Demonic218

+0

In projectInfo Funktion fügen Sie nur context.wait (AfterPromptMethod);) –

Verwandte Themen