C# 如何控制Microsoft Bot Framework对话框通过重新开始或单步执行特定步骤来重复该对话框序列?
当机器人对话开始时,它似乎走上了一条路径,即。 1 2 3 4. 我想在第2点本身回到路径标记1,重新开始这个过程,甚至可能从3到标记2,重新寻址/回答标记2 我尝试使用返回到上一个方法的if语句(=“Pittsburgh”)来执行此操作,但我注意到,通过bot仿真器,无论我如何重新阅读上一个方法,对话框都会继续移动 简言之,我问的是如何遍历Waterwall对话框,并根据与bot和luis的对话结果返回到我选择的任何对话点。也就是说,如果我从1-5步走到3步,我需要重新开始,我如何使Waterwall对话框符合具体要求?我遇到的问题是,尽管我调用了前面的方法,但它并没有正式从名为forwards的方法开始。这是我特别关心的问题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
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