WaterfallDialog 中的 AdaptiveCard 提示不断显示

AdaptiveCard prompt inside a WaterfallDialog keeps showing over and over

我正在测试只有 2 个元素的 Adaptive Card:文本和操作:

它的定义是这样的:

{
    "type": "AdaptiveCard",
    "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
    "version": "1.2",
    "body": [
        {
            "type": "TextBlock",
            "text": "This is a test",
            "wrap": true
        },
        {
            "type": "Input.ChoiceSet",
            "choices": [
                {
                    "title": "Option 1",
                    "value": "1"
                },
                {
                    "title": "Option 1",
                    "value": "2"
                }
            ],
            "placeholder": "Select a option",
            "id": "option"
        },
        {
            "type": "ActionSet",
            "actions": [
                {
                    "type": "Action.Submit",
                    "title": "Next"
                }
            ]
        }
    ]

}

我想在 WaterfallDialog 的对话框中显示此卡片作为提示的一部分,所以我这样做:

public class MyDialog : ComponentDialog
{
    public MyDialog(string id) : base(id)
    {
        //...
        AddDialog(new ChoicePrompt("Test"));
        //...
    }

    private async Task<DialogTurnResult> TestStep(WaterfallStepContext stepcontext, CancellationToken cancellationtoken)
    {
        // Loads the card from the JSON I showed above
        var card = await LoadAdaptiveCard("MyCard.json");
        return await stepcontext.PromptAsync("Test", new PromptOptions()
        {
            Prompt = (Activity)MessageFactory.Attachment(new Attachment
            {
                ContentType = AdaptiveCard.ContentType,
                Content = JObject.FromObject(card),
            }),         
            Style = ListStyle.None,
        }, cancellationtoken);
    }
}

提示显示OK,但点击“Next”后,卡又出现了。它似乎卡在上面,永远不会进入下一个对话步骤。

我希望 下一步 按钮类似于“提交”按钮,可以继续下一步。我的代码有什么问题?

通知

真正的自适应卡是这张:

为了简单起见,我发了一个比较简单的。

在某些情况下,选择输入可用于自动识别卡片操作数据中的选择。您可以看到 here 如何将传入的 activity 的值也用作输入,而不仅仅是 activity 的文本。

if (string.IsNullOrEmpty(dc.Context.Activity.Text) && dc.Context.Activity.Value != null)
{
    input = dc.Context.Activity.Value;
}

但是,您使用的不是选择输入,而是选择 提示。当然,这没有错。提示正是您应该使用的,因为您使用的是瀑布式对话框而不是自适应对话框。重要的是要记住,提示比输入简单一些,在大多数情况下,它们只会说明传入的 activity 的文本而不是值。

这解释了为什么您的提示无法识别卡片的操作数据,但还有一个更大的问题需要考虑。使用提示还是输入并不重要,因为在这种情况下它们都是错误的。选择 prompts/inputs 仅用于识别一个单一的选择,因此它们可能适用于您提供的最小样本卡,但它们不可能适用于您要使用的实际卡。您的实际卡片有多个选择集,选择提示或选择输入无法解释同时做出的多个选择。

鉴于选择提示不是您的正确选择,您仍然需要知道该怎么做。你说你想继续下一个瀑布步骤,这很容易。为了继续下一个瀑布步骤而不是重复提示,甚至不要使用提示。只需将自适应卡作为正常 activity 单独发送,然后 return 一个回合结束结果。如果用户输入文本而不是单击按钮,您将必须在下一个瀑布步骤中以某种方式处理它。

假设这不是很令人满意并且您实际上想要做的不仅仅是确保瀑布对话框继续,您可能仍然需要某种提示。提示确保在您获得所需信息之前对话不会继续,在您的情况下,您需要来自自适应卡的信息。有几个选项供您选择:

  1. 制作属于你自己的特殊自适应卡片提示
  2. Use an Adaptive Card prompt someone else has made
  3. 使用文本提示

第三个选项可能听起来很奇怪,但文本提示很有用,因为它们默认接受任何字符串,并且与任何提示一样,您可以提供自己的自定义验证器以确保数据是您想要的格式.我在我的博客 post 的“对话框中的自适应卡片”部分提供了更多相关信息:https://blog.botframework.com/2019/07/02/using-adaptive-cards-with-the-microsoft-bot-framework/