如何在 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\" }"
,当然,您可以更新它。
更多资源
我正在尝试将 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\" }"
,当然,您可以更新它。
更多资源