如何在 BotFramework 上设置 AdaptiveCard 提交按钮操作的文本值

How to set the text value of AdaptiveCard Submit button action on BotFramework

我正在尝试将 Luis 与 botframework 集成。据我所见(p/s。在这方面还是新的),路易斯根据用户的文本输入处理响应。因此,当我尝试使用自适应卡片提交按钮操作时,我可以设置值但不能设置文本值。即使我在提交按钮上使用 dataJson,它仍然会产生空错误。我仍然对如何处理这个感到困惑。代码如下:

LuisIntent("Greet.Welcome")]
    public async Task QueryGPN(IDialogContext context, IAwaitable<IMessageActivity> activity, LuisResult luisResult)
    {
        AdaptiveCard gpnCard = new AdaptiveCard();

        gpnCard.Body.Add(new TextBlock()
        {
            Text = "GPN Lookup Form",
            Size = TextSize.Large,
            Weight = TextWeight.Bolder
        });

        TextInput gpnInput = new TextInput()
        {
            Id = "GPN",
            IsMultiline = false
        };

        gpnCard.Body.Add(gpnInput);

        gpnCard.Actions.Add(new SubmitAction()
        {
            Title = "Submit"
        });

        Attachment gpnCardAttachment = new Attachment()
        {
            ContentType = AdaptiveCard.ContentType,
            Content = gpnCard
        };

        IMessageActivity gpnFormMessage = context.MakeMessage();
        gpnFormMessage.Attachments = new List<Attachment>();
        gpnFormMessage.Attachments.Add(gpnCardAttachment);

        await context.PostAsync(gpnFormMessage);
        context.Wait(this.MessageReceived);
    }


[LuisIntent("Curse")]
    public async Task Cursing(IDialogContext context, IAwaitable<IMessageActivity> activity, LuisResult luisResult)
    {
        Console.WriteLine("Curse");
        await context.PostAsync($"Curse");
        context.Wait(this.MessageReceived);
    }

情况是我将在文本输入中输入诅咒,我希望机器人将重定向到 "Curse" LuisIntent。

TQVM 高级。

我认为问题是因为您使用的是 LuisDialog 并且您期望从 AdaptiveCards 的提交操作发送的值被对话框用作 [=13] 的输入=].

围绕此的主要问题是提交操作的值没有出现在(新)activity 的 Text 属性 中,而是出现在 Value 属性。我怀疑这是因为你得到了一个 NullReference 异常,因为 LuisDialog 使用 属性 来提取要发送到 LUIS 的值。

好消息是解决这个问题应该非常简单。在幕后,LuisDialog 调用了 GetLuisQueryTextAsync method to extract the text from the IMessageActivity that will be sent to LUIS. This happens on the MessageReceivedAsync 方法。

所以,我相信通过覆盖 GetLuisQueryTextAsync 方法,您应该能够更新逻辑并从 Value 属性 而不是 Text 属性。类似于:

protected override Task<string> GetLuisQueryTextAsync(IDialogContext context, IMessageActivity message)
{
    if (message.Value != null) 
    {
         dynamic value = message.Value;
         // assuming your DataJson has a type property like :
         // DataJson = "{ \"Type\": \"Curse\" }" 
         string submitType = value.Type.ToString();

         return Task.FromResult(submitType);
    }
    else 
    {
       // no Adaptive Card value, let's call the base
       return base.GetLuisQueryTextAsync(context, message);
    }
}

上面的代码假定您的 SubmitAction 有一个 DataJson 属性,其值为 "{ \"Type\": \"Curse\" }",当然,您可以更新它。

更多资源