提示用户在bot中的子对话框中输入字符串

时间:2016-11-18 15:55:41

标签: c# bots botframework luis

我目前正在玩Bots和LUIS。 所以我有一个运行的机器人。在我的RootDialog中,我处理了从LUIS获得的所有意图。现在我想检查一个实体是否缺少一个实体。

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

如果我可以获得用户输入,我会将其传递回我的父对话框。

现在我真的不知道如何阻止Bot让它等待用户输入。 有人可以解释一下我是如何做到的吗? 谢谢!

1 个答案:

答案 0 :(得分:3)

您缺少正在创建的PromptString对话框的context.Call

context.Call方法需要一个对话框和一个&#39;回调&#39;对话框完成后将调用的方法(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);
}