【问题标题】:Not able to pass the selected value to the main dialog in bot framework V4 C#无法将所选值传递给机器人框架 V4 C# 中的主对话框
【发布时间】:2019-07-10 01:59:53
【问题描述】:

我有一组自适应卡片,一旦机器人加载就会显示。在 action.submit 上,我能够获取用户选择的卡片的值,但我无法将该值传递到主对话框中的下一步。

OnTurnAsync 编写如下代码:

public override async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken))
    {
        await base.OnTurnAsync(turnContext, cancellationToken);
        var activity = turnContext.Activity;

        if (string.IsNullOrWhiteSpace(activity.Text) && activity.Value != null)
        {
            activity.Text = JsonConvert.SerializeObject(activity.Value);
        }

        // Save any state changes that might have occured during the turn.
        await ConversationState.SaveChangesAsync(turnContext, false, cancellationToken);
        await UserState.SaveChangesAsync(turnContext, false, cancellationToken);
        switch (activity.Text)
        {
            case "{\"choice\":1}":
                break;
            case "{\"choice\":2}":
               // var msg = $"Platform Assistance";
               // await turnContext.SendActivityAsync(MessageFactory.Text(msg), cancellationToken);
                var welcomeCard = CreateAdaptiveCardAttachment();
                var response = CreateResponse(turnContext.Activity, welcomeCard);
                await turnContext.SendActivityAsync(response, cancellationToken);
                //var response = CreateResponse(turnContext.Activity, welcomeCard);
                break;
        }
        await turnContext.SendActivityAsync(activity, cancellationToken);
    }

在主对话框中

private async Task<DialogTurnResult> HandleResponseAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
    {
        var userResult = stepContext.Result;              

        await stepContext.Context.SendActivityAsync($"INPUT: {stepContext.Result}");
        return await stepContext.NextAsync();
    }

我希望在显示所有卡片后我应该得到用户选择的选项,这将进一步传递给 LUIS 意图

我也尝试过使用文本提示,但代码似乎没有进入“HandleResponseAsync”方法。

【问题讨论】:

    标签: c# botframework


    【解决方案1】:

    你有几个问题。

    主要的

    你说这些太早了:

    // Save any state changes that might have occured during the turn.
    await ConversationState.SaveChangesAsync(turnContext, false, cancellationToken);
    await UserState.SaveChangesAsync(turnContext, false, cancellationToken);
    

    他们必须是OnTurnAsync() 中的最后一件事。将它们移到最后,用户的响应将进入下一步。

    附加

    await turnContext.SendActivityAsync(activity, cancellationToken);
    

    你在OnTurnAsync() 的末尾有这个,这将使它看起来像来自机器人的所有东西都来自用户。删掉就好了。

    资源

    我们刚刚写了一篇关于 using Adaptive Cards 的博文,您可能会觉得有用。

    我还写了一个AdaptiveCardPrompt,您可以使用它来代替文本/选择提示。让它在 C# 中工作有点棘手,因为其中一些类是 internal/protected。您要么需要从Prompt 更改一些常量,要么分叉Dotnet SDK。不建议。我还有一些使用 AdaptiveCardPrompt 的Samples。同样,C# 也有问题。希望这将很快出现在 SDK 中,但这仍是待定。

    【讨论】:

    • 嗨理查森,我按照你的建议做了,但它仍然没有进入主对话框。还有什么遗漏吗?
    • @user64870 你能分享一个指向你的仓库的链接吗?我使用了您包含的代码并进行了上述更改,对我来说效果很好。如果没有您的所有代码,很难进一步诊断。
    • 嗨,我的代码位置:github.com/usheveta/BotV4/blob/master/LuisBot.zip 我做了一些更改,它现在不调用对话框。此外,当我发布这个机器人时,如果没有用户打招呼,卡片就不会出现,但在模拟器中它工作正常。知道为什么会这样吗?
    • 给其他人的注意事项:OP和我通过电子邮件对应后续问题。上面的答案解决了发布的问题,但还有其他问题阻止了 OP 使其正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 2021-12-13
    相关资源
    最近更新 更多