textprompt after button click in adaptive card doesnt invoke next step

别等时光非礼了梦想. 提交于 2019-12-13 03:33:59

问题


Functionality:

  1. Fetch and display relevant answer from QnAMaker
  2. This response must be followed by an adaptive card with checkboxes
  3. Based on the values selected, invoke a web service to provide the user with required file links.
  4. Display a feedback message 'Did this help?'
  5. Direct the conversation flow based on user response.

Problem Statement: For the step 2 mentioned above, the button click is being handled at the bot.cs file and redirected to a new Dialog. Everything works fine until displaying the feedback message(which is again invoked from a new Dialog). However, after this text prompt the next step is not called and exits with an error: The given key 'dialogs' was not present in the dictionary.

Why does it show that error without going to the next step?

bot.cs

public async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken))
{
    if (turnContext.Activity.Type == ActivityTypes.Message)
    {
        if (turnContext.Activity.Text != null)
        {
            if (!dc.Context.Responded)
            {
                // examine results from active dialog
                switch (dialogResult.Status)
                {
                    case DialogTurnStatus.Empty:
                        switch (topIntent)
                        {
                            case ...
                        }

                        break;

                    case ...
                }
            }
        }
        else if (string.IsNullOrEmpty(turnContext.Activity.Text))
        {
            await HandleSubmitActionAsync(turnContext, userProfile);
        }
    }
}

private async Task HandleSubmitActionAsync(ITurnContext turnContext, UserProfile userProfile)
{
    if (value.Type == "GetCredentials")
    {
        userProfile.credentialsCard = true;
    }

    await dc.BeginDialogAsync(nameof(HandleButtonDialog));
}

HandleButtonDialog:

public HandleButtonDialog(BotServices _services, UserProfile _userProfile) : base(Name)
{
    botServices = _services ?? throw new ArgumentNullException(nameof(_services));
    userProfile = _userProfile;

    var waterfallSteps = new WaterfallStep[]
    {
        GetFeedbackStepAsync,
        FeedbackStepAsync,
        FeedbackResponseStepAsync,
    };
    AddDialog(new WaterfallDialog(HBFeedbackDialog));
    AddDialog(new TextPrompt("userFeed"));
}

public override async Task<DialogTurnResult> BeginDialogAsync(DialogContext dc, object options = null, CancellationToken cancellationToken = default(CancellationToken))
{
    if...
    else if(userProfile.credentialsCard == true)
    {
        await dc.BeginDialogAsync(HandleCredentialsFeedbackDialog.Name);
    }
}

HandleCredentialsFeedbackDialog:

public class HandleCredentialsFeedbackDialog : ComponentDialog
{
    public HandleCredentialsFeedbackDialog(BotServices services, UserProfile _userProfile,string dialogId = null) : base(Name)
    {
        botServices = services ?? throw new ArgumentNullException(nameof(services));
        userProfile = _userProfile;

        // This array defines how the Waterfall will execute.
        var waterfallSteps = new WaterfallStep[]
        {
            CredsValidate,
            GetFeedbackStepAsync,
            FeedbackStepAsync,
            FeedbackResponseStepAsync,
        };
        AddDialog(new TextPrompt("userFeed"));
        AddDialog(new WaterfallDialog(HBFeedbackDialog, waterfallSteps));
        InitialDialogId = HBFeedbackDialog;
    }

    public async Task<DialogTurnResult> CredsValidate(WaterfallStepContext stepContext, CancellationToken cancellationToken)
    {
        VALIDATE THE CHECKBOX SELECTED VALUES
        ....

        //Invoke Web Service
        var qnaReuslt = await MakeBatchRequestCreds(stepContext.Context, finalSearchList.ToArray());

        return await stepContext.PromptAsync("userFeed", new PromptOptions
        {
            Prompt = stepContext.Context.Activity.CreateReply("Did this help?")
        });
    }
}

Error Stack Trace:

   at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
   at Microsoft.Bot.Builder.Dialogs.ComponentDialog.RepromptDialogAsync(ITurnContext turnContext, DialogInstance instance, CancellationToken cancellationToken) in d:\a\1\s\libraries\Microsoft.Bot.Builder.Dialogs\ComponentDialog.cs:line 112
   at Microsoft.Bot.Builder.Dialogs.ComponentDialog.ResumeDialogAsync(DialogContext outerDc, DialogReason reason, Object result, CancellationToken cancellationToken) in d:\a\1\s\libraries\Microsoft.Bot.Builder.Dialogs\ComponentDialog.cs:line 106
   at Microsoft.Bot.Builder.Dialogs.DialogContext.EndDialogAsync(Object result, CancellationToken cancellationToken) in d:\a\1\s\libraries\Microsoft.Bot.Builder.Dialogs\DialogContext.cs:line 196
   at AESAiLean.Dialogs.HandleButtonDialog.BeginDialogAsync(DialogContext dc, Object options, CancellationToken cancellationToken) in C:\Users\...\Dialogs\HandleButtonDialog.cs:line 199
   at Microsoft.Bot.Builder.Dialogs.DialogContext.BeginDialogAsync(String dialogId, Object options, CancellationToken cancellationToken) in d:\a\1\s\libraries\Microsoft.Bot.Builder.Dialogs\DialogContext.cs:line 113
   at AESAiLean.AESAiLeanBot.HandleSubmitActionAsync(ITurnContext turnContext, UserProfile userProfile) in C:\Users\...\Bots\AESAiLeanBot.cs:line 361

来源:https://stackoverflow.com/questions/57061353/textprompt-after-button-click-in-adaptive-card-doesnt-invoke-next-step

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!