Bot框架,使用C#,在子对话框中保持对话

Bot框架,使用C#,在子对话框中保持对话,c#,.net,botframework,C#,.net,Botframework,我有一个父对话框,它向用户抛出一个提示,并提供一些选项供选择。根据选择的选项,我调用子对话框。现在,在子对话框中,我想首先给出说明,并要求用户根据说明提供数据。所以,在给出指令之后,我想等待用户的输入。使用下面的代码,在给出关于指令的消息后,执行返回到父对话框,并在父对话框上执行子对话框post completion方法(在函数“AfterAllDoneAsync”下面的代码中)。有人能帮忙吗 以下是我的密码- 消息控制器 public async Task<HttpResponseM

我有一个父对话框,它向用户抛出一个提示,并提供一些选项供选择。根据选择的选项,我调用子对话框。现在,在子对话框中,我想首先给出说明,并要求用户根据说明提供数据。所以,在给出指令之后,我想等待用户的输入。使用下面的代码,在给出关于指令的消息后,执行返回到父对话框,并在父对话框上执行子对话框post completion方法(在函数“AfterAllDoneAsync”下面的代码中)。有人能帮忙吗

以下是我的密码-

消息控制器

  public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
    {
        if (activity.Type == ActivityTypes.Message)
        {
            await Conversation.SendAsync(activity, () => new Dialogs.RootDialog());
        }
        else
        {
            HandleSystemMessage(activity);
        }
        var response = Request.CreateResponse(HttpStatusCode.OK);
        return response;
    }
公共异步任务发布([FromBody]活动)
{
if(activity.Type==ActivityTypes.Message)
{
wait Conversation.sendaync(活动,()=>newdialogs.RootDialog());
}
其他的
{
HandleSystemMessage(活动);
}
var response=Request.CreateResponse(HttpStatusCode.OK);
返回响应;
}
根目录对话框

public Task StartAsync(IDialogContext context)
    {
        context.Wait(MessageReceivedAsync);

        return Task.CompletedTask;
    }

    private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)
    {

        var activity = await result as Activity;
        string txt = activity.Text.ToLower() + " ";

        if (txt.StartsWith("Image"))
        {
            // Prompt user with options and based on chosen option, call child dialog
            var opt = new PromptOptions<String>("Choose from following -", "Didn't get that, please try again", "You are tough! I give up!", new string[] { "one", "two", "three" });
        PromptDialog.Choice(context, AfterPromptAsync, opt);

        }
    }

 public async Task AfterPromptAsync(IDialogContext context, IAwaitable<string> argument)
    {
        var confirm = await argument;
        if (confirm == "one")
        { 
            // call child dialog
            await context.Forward(new ChildDialog(), AfterAllDoneAsync, context.Activity,CancellationToken.None);
        }
        context.Wait(MessageReceivedAsync);
    }
    public async Task AfterAllDoneAsync(IDialogContext context, IAwaitable<object> argument)
    {
        await context.PostAsync("It was really great talking to you!");
        context.Wait(MessageReceivedAsync);
    }
 public Task StartAsync(IDialogContext context)
    {
        context.Wait(this.MessageReceivedAsync);
        return Task.CompletedTask;
    }

    private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)
    {
        var act = await result as Activity;
        if(act.Attachments.Count == 0)
        {
            await context.PostAsync("Follow these instrutions bla bla bla");
        }
        // Then i want to wait for the user to provide the needed data as per instructions but the control goes back to root dialog
        context.Wait(this.MessageReceivedAsync);
    }
公共任务StartSync(IDialogContext上下文)
{
Wait(MessageReceivedAsync);
返回Task.CompletedTask;
}
专用异步任务消息ReceivedAsync(IDialogContext上下文,IAwaitable结果)
{
var活动=等待作为活动的结果;
string txt=activity.Text.ToLower()+“”;
if(txt.StartsWith(“图像”))
{
//使用选项提示用户,并根据所选选项调用子对话框
var opt=new prompoptions(“从以下选项中选择-”,“没有得到,请再试一次”,“你很强硬!我放弃!”,新字符串[]{“一”,“二”,“三”});
PromptDialog.Choice(上下文、AfterPromptSync、opt);
}
}
公共异步任务AfterPromptAsync(IDialogContext上下文,IAwaitable参数)
{
var确认=等待参数;
如果(确认=“一”)
{ 
//调用子对话框
wait context.Forward(new ChildDialog(),AfterAllDoneAsync,context.Activity,CancellationToken.None);
}
Wait(MessageReceivedAsync);
}
公共异步任务AfterAllDoneAsync(IDialogContext上下文,IAwaitable参数)
{
等待上下文。PostAsync(“与您交谈真是太好了!”);
Wait(MessageReceivedAsync);
}
子对话框

public Task StartAsync(IDialogContext context)
    {
        context.Wait(MessageReceivedAsync);

        return Task.CompletedTask;
    }

    private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)
    {

        var activity = await result as Activity;
        string txt = activity.Text.ToLower() + " ";

        if (txt.StartsWith("Image"))
        {
            // Prompt user with options and based on chosen option, call child dialog
            var opt = new PromptOptions<String>("Choose from following -", "Didn't get that, please try again", "You are tough! I give up!", new string[] { "one", "two", "three" });
        PromptDialog.Choice(context, AfterPromptAsync, opt);

        }
    }

 public async Task AfterPromptAsync(IDialogContext context, IAwaitable<string> argument)
    {
        var confirm = await argument;
        if (confirm == "one")
        { 
            // call child dialog
            await context.Forward(new ChildDialog(), AfterAllDoneAsync, context.Activity,CancellationToken.None);
        }
        context.Wait(MessageReceivedAsync);
    }
    public async Task AfterAllDoneAsync(IDialogContext context, IAwaitable<object> argument)
    {
        await context.PostAsync("It was really great talking to you!");
        context.Wait(MessageReceivedAsync);
    }
 public Task StartAsync(IDialogContext context)
    {
        context.Wait(this.MessageReceivedAsync);
        return Task.CompletedTask;
    }

    private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)
    {
        var act = await result as Activity;
        if(act.Attachments.Count == 0)
        {
            await context.PostAsync("Follow these instrutions bla bla bla");
        }
        // Then i want to wait for the user to provide the needed data as per instructions but the control goes back to root dialog
        context.Wait(this.MessageReceivedAsync);
    }
公共任务StartSync(IDialogContext上下文)
{
context.Wait(this.MessageReceivedAsync);
返回Task.CompletedTask;
}
专用异步任务消息ReceivedAsync(IDialogContext上下文,IAwaitable结果)
{
var act=等待作为活动的结果;
如果(act.Attachments.Count==0)
{
等待上下文。PostAsync(“遵循这些说明bla bla bla”);
}
//然后我想等待用户按照说明提供所需的数据,但控件返回到根对话框
context.Wait(this.MessageReceivedAsync);
}
这是输出

U形图像

机器人 从以下选项中选择- 一 二 三

U-1

机器人- 遵循这些指示等等
和你谈话真是太好了

您正在转发到子对话框,并在第一个对话框中等待。只有在不转发的情况下(基本上是添加一个
else
:),才需要更新
AfterPromptAsync
的代码以等待

PromptAsync之后的公共异步任务(IDialogContext上下文,IAwaitable参数) { var确认=等待参数; 如果(确认=“一”) { //调用子对话框 wait context.Forward(new ChildDialog(),AfterAllDoneAsync,context.Activity,CancellationToken.None); } 其他的 { Wait(MessageReceivedAsync); } }
您正在转发到子对话框,并在第一个对话框中等待。只有在不转发的情况下(基本上是添加一个
else
:),才需要更新
AfterPromptAsync
的代码以等待

PromptAsync之后的公共异步任务(IDialogContext上下文,IAwaitable参数) { var确认=等待参数; 如果(确认=“一”) { //调用子对话框 wait context.Forward(new ChildDialog(),AfterAllDoneAsync,context.Activity,CancellationToken.None); } 其他的 { Wait(MessageReceivedAsync); } }
谢谢!我不会注意到的,谢谢!我不会注意到的。