Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.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# BOTFramew4:活动对话框的ID即使在其他对话框处于活动状态时也不会更改_C#_Botframework - Fatal编程技术网

C# BOTFramew4:活动对话框的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

我需要根据活动对话框的Id设置一个条件,如下所示

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;
}