Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何控制Microsoft Bot Framework对话框通过重新开始或单步执行特定步骤来重复该对话框序列?_C#_Asp.net Core_.net Core_Botframework_Bots - Fatal编程技术网

C# 如何控制Microsoft Bot Framework对话框通过重新开始或单步执行特定步骤来重复该对话框序列?

C# 如何控制Microsoft Bot Framework对话框通过重新开始或单步执行特定步骤来重复该对话框序列?,c#,asp.net-core,.net-core,botframework,bots,C#,Asp.net Core,.net Core,Botframework,Bots,当机器人对话开始时,它似乎走上了一条路径,即。 1 2 3 4. 我想在第2点本身回到路径标记1,重新开始这个过程,甚至可能从3到标记2,重新寻址/回答标记2 我尝试使用返回到上一个方法的if语句(=“Pittsburgh”)来执行此操作,但我注意到,通过bot仿真器,无论我如何重新阅读上一个方法,对话框都会继续移动 简言之,我问的是如何遍历Waterwall对话框,并根据与bot和luis的对话结果返回到我选择的任何对话点。也就是说,如果我从1-5步走到3步,我需要重新开始,我如何使Water

当机器人对话开始时,它似乎走上了一条路径,即。 1 2 3 4. 我想在第2点本身回到路径标记1,重新开始这个过程,甚至可能从3到标记2,重新寻址/回答标记2

我尝试使用返回到上一个方法的if语句(=“Pittsburgh”)来执行此操作,但我注意到,通过bot仿真器,无论我如何重新阅读上一个方法,对话框都会继续移动

简言之,我问的是如何遍历Waterwall对话框,并根据与bot和luis的对话结果返回到我选择的任何对话点。也就是说,如果我从1-5步走到3步,我需要重新开始,我如何使Waterwall对话框符合具体要求?我遇到的问题是,尽管我调用了前面的方法,但它并没有正式从名为forwards的方法开始。这是我特别关心的问题

private async Task destinationstepsync(waterwallstepcontext stepContext,CancellationToken CancellationToken)
{
var bookingDetails=(bookingDetails)stepContext.Options;
if(bookingDetails.Destination==null)
{
return wait-stepContext.PromptAsync(nameof(TextPrompt),new-PromptOptions{Prompt=MessageFactory.Text(“您想去哪里旅行?”),cancellationToken);
}
其他的
{
Console.WriteLine(“测试克里斯蒂安”+预订详情);
return wait stepContext.NextAsync(bookingDetails.Destination,cancellationToken);
}
}
专用异步任务OriginStepAsync(WaterCallStepContext stepContext,CancellationToken CancellationToken)
{
Console.WriteLine(“测试paul”);
var bookingDetails=(bookingDetails)stepContext.Options;
//等待LuisHelper.ExecuteLuisQuery(配置、记录器、stepContext.Context、cancellationToken);
if((字符串)stepContext.Result==“Pittsburgh”)
{
返回等待目的地StepAsync(stepContext,cancellationToken);
}
bookingDetails.Destination=(string)stepContext.Result;
if(bookingDetails.Origin==null)
{
控制台。写入线(“测试高度”+预订详细信息。目的地);
return wait-stepContext.PromptAsync(nameof(TextPrompt),newpromptoptions{Prompt=MessageFactory.Text(“您从哪里来?”)},cancellationToken);
}
其他的
{
return wait stepContext.NextAsync(bookingDetails.Origin,cancellationToken);
}
}

要将这一点纳入答案,并从评论中删除,请执行以下操作:

瀑布的设计不是为了以任何方式穿越,而是一步一步/一步一步地穿越。您可以在每个瀑布步骤中嵌套迷你瀑布,允许循环单个步骤,也可以使用条件检查跳过某些步骤

您似乎在寻找的是
组件对话框
或使用
ReplaceDialogAsync
。组件对话框,botbuilder对话框库的一部分,允许您将机器人的逻辑分解为组件(片段),这些组件(片段)可以添加到对话框集或其他组件对话框中。例如,这是Bot框架示例github repo上核心Bot示例的取消/帮助组件。如果在另一个瀑布的中间,用户说“取消”或“帮助”< /P>,这个组件就是这样做的。
public class CancelAndHelpDialog : ComponentDialog
    {
        public CancelAndHelpDialog(string id)
            : base(id)
        {
        }

        protected override async Task<DialogTurnResult> OnBeginDialogAsync(DialogContext innerDc, object options, CancellationToken cancellationToken)
        {
            var result = await InterruptAsync(innerDc, cancellationToken);
            if (result != null)
            {
                return result;
            }

            return await base.OnBeginDialogAsync(innerDc, options, cancellationToken);
        }

        protected override async Task<DialogTurnResult> OnContinueDialogAsync(DialogContext innerDc, CancellationToken cancellationToken)
        {
            var result = await InterruptAsync(innerDc, cancellationToken);
            if (result != null)
            {
                return result;
            }

            return await base.OnContinueDialogAsync(innerDc, cancellationToken);
        }

        private async Task<DialogTurnResult> InterruptAsync(DialogContext innerDc, CancellationToken cancellationToken)
        {
            if (innerDc.Context.Activity.Type == ActivityTypes.Message)
            {
                var text = innerDc.Context.Activity.Text.ToLowerInvariant();

                switch (text)
                {
                    case "help":
                    case "?":
                        await innerDc.Context.SendActivityAsync($"Show Help...");
                        return new DialogTurnResult(DialogTurnStatus.Waiting);

                    case "cancel":
                    case "quit":
                        await innerDc.Context.SendActivityAsync($"Cancelling");
                        return await innerDc.CancelAllDialogsAsync();
                }
            }

            return null;
        }
    }
公共类CancelAndHelpDialog:ComponentDialog
{
公共CancelAndHelpDialog(字符串id)
:base(id)
{
}
受保护的重写异步任务OnBeginDialogAsync(DialogContext innerDc,对象选项,CancellationToken CancellationToken)
{
var结果=等待中断异步(innerDc,cancellationToken);
如果(结果!=null)
{
返回结果;
}
return wait base.OnBeginDialogAsync(innerDc,options,cancellationToken);
}
受保护的覆盖异步任务OnContinueDialogAsync(DialogContext innerDc,CancellationToken CancellationToken)
{
var结果=等待中断异步(innerDc,cancellationToken);
如果(结果!=null)
{
返回结果;
}
返回wait base.OnContinueDialogAsync(innerDc,cancellationToken);
}
专用异步任务中断异步(DialogContext innerDc,CancellationToken CancellationToken)
{
if(innerDc.Context.Activity.Type==ActivityTypes.Message)
{
var text=innerDc.Context.Activity.text.ToLowerInvariant();
开关(文本)
{
案例“帮助”:
案例“?”:
等待innerDc.Context.SendActivityAsync($“显示帮助…”);
返回新的DialogTurnResult(DialogTurnStatus.Waiting);
“取消”案例:
“退出”案例:
等待innerDc.Context.SendActivityAsync($“取消”);
return wait innerDc.CancelAllDialogsAsync();
}
}
返回null;
}
}

正如@Matt Stannett所提到的:自19年5月22日起,有一个关于如何制作包括组件对话框在内的复杂对话框的教程。

要将其纳入答案并从注释中获取,请执行以下操作:

瀑布的设计不是为了以任何方式穿越,而是一步一步/一步一步地穿越。您可以在每个瀑布步骤中嵌套迷你瀑布,允许循环单个步骤,也可以使用条件检查跳过某些步骤

W