2016-11-18 7 views
1

В настоящее время я играю с ботами и LUIS. Итак, у меня есть бегущий бот. В моем RootDialog я обрабатываю все намерения, которые я получаю от LUIS. Теперь я хочу проверить, отсутствует ли Entity для намерения.Запросить пользователя для строки в дочернем диалоговом окне в боте

if (result.Entities.Count == 0) { 
var ct = new CancellationToken(); 
await context.Forward(new ParameterDialog(), ResumeAfterParameterDialog, message, ct); 

Если нет объекта, я создаю новое дочернее диалоговое окно.

public class ParameterDialog : IDialog<object> { 
     public async Task StartAsync(IDialogContext context) { 
      context.Wait(MessageReceivedAsync); 
    } 



    public async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> argument) { 

     argument = new PromptDialog.PromptString("Please enter a parameter", "please try again", 2); 

     var prompt = await argument; 

     await context.PostAsync($"Your Parameter is: {prompt}"); 
     context.Done(prompt); 
    }    
} 

Если бы я мог получить пользовательский ввод, я бы передал его обратно в родительский диалог.

Теперь я не знаю, как я могу остановить Бот и позволить ему ждать ввода пользователя. Может кто-нибудь объяснить, как я могу это сделать? Спасибо!

ответ

3

Вам не нужен context.Call диалогового окна PromptString.

Метод context.Call ожидает диалога и метода обратного вызова (ResumeAfter), который будет вызываться после завершения диалога (в этом случае, когда PromptString завершает работу).

В вашем сценарии ваш код должен выглядеть следующим образом:

public async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> argument) 
{ 
    var dialog = new PromptDialog.PromptString("Please enter a parameter", "please try again", 2); 

    context.Call(dialog, ResumeAfterPrompt) 
} 

private Task ResumeAfterPrompt(IDialogContext context, IAwaitable<string> result) 
{ 
    var parameter = await result; 
    context.Done(parameter); 
}