3

我试图将 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。

4

1 回答 1

4

我认为问题在于您使用的是 aLuisDialog并且您期望从AdaptiveCards的提交操作发送的值被对话框用作LUIS.

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

好消息是解决这个问题应该非常简单。在幕后,LuisDialog调用GetLuisQueryTextAsyncIMessageActivity方法从将要发送到的文本中提取文本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);
    }
}

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

更多资源

于 2018-02-22T22:23:28.193 回答