【问题标题】:How to set the text value of AdaptiveCard Submit button action on BotFramework如何在 BotFramework 上设置 AdaptiveCard 提交按钮操作的文本值
【发布时间】:2018-08-01 20:20:17
【问题描述】:

我正在尝试将 Luis 与 botframework 集成。从我所看到的(p/s. 仍然是新的),Luis 根据用户的文本输入处理响应。因此,当我尝试使用自适应卡片提交按钮操作时,我可以设置值但不能设置文本值。即使我在提交按钮上使用 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。

【问题讨论】:

  • 不清楚你在问什么。您能否详细说明您的功能案例是什么?你想在你的卡片上显示什么?看起来你在混合东西
  • 在通过 TextInput 提交信息后收到的 Activity 是否有数据属性?
  • 我只是根据我对场景的理解提供了一个答案
  • @NicolasR 这与卡无关。情况是我将文本输入到 AdaptiveCard textInput 中,我希望它能够达到 Luis Intent 之一。在这种情况下,我将诅咒放入其中,LuisIntent("Curse") 将被击中。我使用 SubmitAction 按钮的 DataJson 属性,这将填充 Activity 的 value 属性。据我了解,Luis 不会读取 Activity 的 value 属性而是 text 属性,所以我没有得到 LuisIntent 的命中
  • @StevenG。对。 textInput 文本填充在活动的“值”属性中。

标签: c# botframework azure-language-understanding adaptive-cards


【解决方案1】:

我认为问题在于您使用的是LuisDialog,并且您希望对话框使用从AdaptiveCards 的提交操作发送的值作为LUIS 的输入。

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

好消息是解决这个问题应该很简单。在幕后,LuisDialog 调用GetLuisQueryTextAsync 方法从IMessageActivity 中提取将发送到LUIS 的文本。这发生在 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\" }",但当然,您可以更新它。

更多资源

【讨论】:

  • “我怀疑这是因为你得到了 NullReference 异常,因为 LuisDialog 使用该属性来提取要发送到 LUIS 的值。” - 对。这是我得到的确切问题。 Tqvm 为您解答。我发现的另一件事是,当我使用 SubmitAction 按钮的“数据”属性时,textInput 值将填充到新操作的“文本”属性中,并且 LuisIntent 被命中。所以对data和datajson的区别有点困惑。
猜你喜欢
  • 1970-01-01
  • 2012-09-10
  • 1970-01-01
  • 2012-07-10
  • 1970-01-01
  • 2013-07-13
  • 2018-09-30
  • 1970-01-01
  • 2011-05-09
相关资源
最近更新 更多