我目前正在玩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让它等待用户输入。 有人可以解释一下我是如何做到的吗? 谢谢!
答案 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);
}