C# BOTFramew4:活动对话框的ID即使在其他对话框处于活动状态时也不会更改
我需要根据活动对话框的Id设置一个条件,如下所示C# BOTFramew4:活动对话框的ID即使在其他对话框处于活动状态时也不会更改,c#,botframework,C#,Botframework,我需要根据活动对话框的Id设置一个条件,如下所示 var dc = await _dialogs.CreateContextAsync(turnContext); if (dc.ActiveDialog != null && dc.ActiveDialog.id == "SkipLuisDialog") { var interruptedQnaMaker = await IsTurnInterruptedDispatchToQnAMakerAsync(turnContex
var dc = await _dialogs.CreateContextAsync(turnContext);
if (dc.ActiveDialog != null && dc.ActiveDialog.id == "SkipLuisDialog")
{
var interruptedQnaMaker = await IsTurnInterruptedDispatchToQnAMakerAsync(turnContext, topDispatch, QnaConfiguration, cancellationToken);
}
当我检查OnTurnAsync()
上的活动对话框时,如下所示:
if (dc.ActiveDialog != null)
{
await dc.Context.SendActivityAsync(dc.ActiveDialog.Id.ToString());
}
______________
| FAQDialogId |
|______________|
______________
| MainDialog |
|______________|
_______________________
| ______________ |
| |__FAQDialog__| |
| |
| MainDialog |
|_______________________|
它总是说“mainDialog”,这是我的主对话框的ID。即使im在“FAQDialog”或“complaintDialog”上,活动对话框ID始终为“mainDialog”。为什么当im在FAQ对话框中时,活动对话框Id没有更改为“FAQ对话框”,或者当im在投诉对话框中时,活动对话框Id没有更改为“投诉对话框”
我的主对话框和其他对话框在另一个类中。
这就是我在OnTurnAsync()上调用main对话框的方式。
:
主对话框:
namespace CoreBot.Dialogs
{
公共类MainDialog:ComponentDialog
{
private const string InitialId=“mainDialog”;
私有常量字符串TextPromptId=“textPrompt”
private const string ComplaintDialogId=“complaintDialog”;
私有常量字符串FAQDialogId=“FAQDialog”;
公共MainDialog(字符串dialogId):基本(dialogId)
{
waterwallstep[]waterwallsteps=新的waterwallstep[]
{
FirstStepAsync,
第二步异步,
第三步同步,
};
AddDialog(新的WaterWallDialog(初始ID,WaterWallSteps));
AddDialog(新建FAQDialog(FAQDialogId));
AddDialog(新文件ComplaintDialog(ComplaintDialogId));
AddDialog(新建文本提示(TextPromptId));
}
专用静态异步任务FirstStepAsync(WaterCallStepContext stepContext,CancellationToken CancellationToken=default(CancellationToken))
{
return wait stepContext.PromptAsync(
文本提示,
新提示
{
Prompt=新活动
{
类型=ActivityTypes.Message,
Text=$“我能为您做些什么?”,
SuggestedActions=新SuggestedActions()
{
操作=新列表()
{
new CardAction(){Title=“常见问题”,Type=ActionTypes.ImBack,Value=“常见问题”},
new CardAction(){Title=“提交投诉单”,Type=ActionTypes.ImBack,Value=“提交投诉单”},
},
},
},
});
}
专用静态异步任务SecondStepAsync(WaterCallStepContext stepContext,CancellationToken CancellationToken=default(CancellationToken))
{
var response=stepContext.Result.ToString().ToLower();
字符串[]FAQArray={“常见问题”、“问题”、“提问”};
字符串[]ComplaintsArray={“提交投诉单”、“投诉”、“提交投诉”};
if(FAQArray.Contains(响应))
{
返回wait wait stepContext.BeginDialogAsync(FAQDialogId,cancellationToken);
}
if(投诉包含(响应))
{
等待stepContext.EndDialogAsync();
返回wait wait stepContext.BeginDialogAsync(ComplaintDialogId,cancellationToken:cancellationToken);
}
返回wait-stepContext.NextAsync();
}
专用静态异步任务第三步同步(WaterWallStepContext stepContext,CancellationToken CancellationToken=default(CancellationToken))
{
返回wait-stepContext.ReplaceDialogAsync(InitialId);
}
}
}
主对话框调用2个对话框。这是其中之一
namespace CoreBot.Dialogs
{
public class FAQDialog : ComponentDialog
{
private const string InitialId = "FAQDialog";
private const string ChoicePromptId = "choicePrompt";
private const string TextPromptId = "textPrompt";
private const string ConfirmPromptId = "confirmPrompt";
public FAQDialog(string dialogId) : base(dialogId)
{
WaterfallStep[] waterfallSteps = new WaterfallStep[]
{
FirstStepAsync,
SecondStepAsync,
ThirdStepAsync,
FourthStepAsync,
};
AddDialog(new WaterfallDialog(InitialId, waterfallSteps));
AddDialog(new ChoicePrompt(ChoicePromptId));
AddDialog(new ConfirmPrompt(ConfirmPromptId));
AddDialog(new TextPrompt(TextPromptId));
}
private static async Task<DialogTurnResult> FirstStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken = default(CancellationToken))
{
var choices = new List<Choice>();
choices.Add(new Choice { Value = "This is Sample Question 1", Synonyms = new List<string> { "Question 1" } });
choices.Add(new Choice { Value = "This is Sample Question 2", Synonyms = new List<string> { "Question 2" } });
return await stepContext.PromptAsync(
ChoicePromptId,
new PromptOptions
{
Prompt = MessageFactory.Text($"Welcome to FAQ! Choose the number of the question or type your own question."),
Choices = choices,
});
}
private static async Task<DialogTurnResult> SecondStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken = default(CancellationToken))
{
var choiceResult = (stepContext.Result as FoundChoice).Value.ToLower();
switch (choiceResult)
{
case "this is sample question 1":
await stepContext.Context.SendActivityAsync(MessageFactory.Text($"Answer to question 1."));
break;
case "this is sample question 2":
await stepContext.Context.SendActivityAsync(MessageFactory.Text($"Answer to question 2."));
break;
default:
break;
}
return await stepContext.NextAsync();
}
private static async Task<DialogTurnResult> ThirdStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken = default(CancellationToken))
{
return await stepContext.PromptAsync(
ConfirmPromptId,
new PromptOptions
{
Prompt = MessageFactory.Text($"Have another question?"),
});
}
private static async Task<DialogTurnResult> FourthStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken = default(CancellationToken))
{
var confirmResult = (bool)stepContext.Result;
if (confirmResult)
{
await stepContext.Context.SendActivityAsync(MessageFactory.Text($"Ask away!"));
return await stepContext.ReplaceDialogAsync(InitialId);
}
else
{
await stepContext.Context.SendActivityAsync(MessageFactory.Text($"Great!"));
return await stepContext.EndDialogAsync();
}
}
}
}
namespace CoreBot.Dialogs
{
公共类FAQ对话框:ComponentDialog
{
private const string InitialId=“FAQDialog”;
私有常量字符串choicepromptd=“choicePrompt”;
私有常量字符串TextPromptId=“textPrompt”;
private const string ConfirmPromptId=“confirmPrompt”;
公共对话(字符串对话ID):基本(对话ID)
{
waterwallstep[]waterwallsteps=新的waterwallstep[]
{
FirstStepAsync,
第二步异步,
第三步同步,
第四步异步,
};
AddDialog(新的WaterWallDialog(初始ID,WaterWallSteps));
AddDialog(新建ChoicePrompt(ChoicePrompId));
AddDialog(新建ConfirmPrompt(ConfirmPromptId));
AddDialog(新建文本提示(TextPromptId));
}
专用静态异步任务FirstStepAsync(WaterCallStepContext stepContext,CancellationToken CancellationToken=default(CancellationToken))
{
var choices=新列表();
添加(新选项{Value=“这是示例问题1”,同义词=新列表{“问题1”});
添加(新选项{Value=“这是示例问题2”,同义词=新列表{“问题2”});
return wait stepContext.PromptAsync(
ChoicePromptId,
新提示
{
Prompt=MessageFactory.Text($“欢迎使用常见问题解答!选择问题编号或键入您自己的问题”),
选择=选择,
});
}
专用静态异步任务SecondStepAsync(WaterCallStepContext stepContext,CancellationToken CancellationToken=default(CancellationToken))
{
var choiceResult=(stepContext.Result作为FoundChoice.Value.ToLower();
开关(choiceResult)
{
案例“这是示例问题1”:
等待stepContext.Context.SendActivityAsync(MessageFactory.Text($“问题1的答案”);
打破
案例“这是示例问题2”:
等待stepContext.Context.SendActivityAsync(MessageFactory.Text($“问题2的答案”);
打破
违约:
打破
}
return wait stepContext.NextAsy
___________
______________
| MainDialog |
|______________|
______________
| FAQDialogId |
|______________|
______________
| MainDialog |
|______________|
_______________________
| ______________ |
| |__FAQDialog__| |
| |
| MainDialog |
|_______________________|
return await stepContext.EndDialogAsync("FAQDialog");
switch (dialogResult)
{
case "FAQDialog":
dc.BeginDialogAsync(FAQDialogId, cancellationToken);
break;
case "ComplaintDialog":
dc.BeginDialogAsync(ComplaintDialogId, cancellationToken);
break;
}
if (dc.ActiveDialog != null && IsDialogInStack(dc.ActiveDialog, "SkipLuisDialog"))
{
var interruptedQnaMaker = await IsTurnInterruptedDispatchToQnAMakerAsync(turnContext, topDispatch, QnaConfiguration, cancellationToken);
}
[...]
private bool IsDialogInStack(DialogInstance activeDialog, string searchId)
{
if (activeDialog.Id == searchId)
{
return true;
};
foreach (KeyValuePair<string, object> item in activeDialog.State)
{
if (item.Key == "dialogs" && item.Value is DialogState)
{
DialogState dialogState = (DialogState)item.Value;
foreach (DialogInstance dialog in dialogState.DialogStack)
{
return IsDialogInStack(dialog, searchId);
}
}
}
return false;
}