C# 如何在BotFramework上设置AdaptiveCard Submit按钮操作的文本值
我正在尝试将Luis与botframework集成。从我所看到的(p/s.在这方面还是新的),Luis根据用户的文本输入处理响应。因此,当我尝试使用自适应卡片提交按钮操作时,我可以设置值,但不能设置文本值。即使我在submit按钮上使用dataJson,它仍然会产生空错误。我仍然对如何处理这个问题感到困惑。代码如下:C# 如何在BotFramework上设置AdaptiveCard Submit按钮操作的文本值,c#,botframework,azure-language-understanding,adaptive-cards,C#,Botframework,Azure Language Understanding,Adaptive Cards,我正在尝试将Luis与botframework集成。从我所看到的(p/s.在这方面还是新的),Luis根据用户的文本输入处理响应。因此,当我尝试使用自适应卡片提交按钮操作时,我可以设置值,但不能设置文本值。即使我在submit按钮上使用dataJson,它仍然会产生空错误。我仍然对如何处理这个问题感到困惑。代码如下: LuisIntent("Greet.Welcome")] public async Task QueryGPN(IDialogContext context, IAwait
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);
}
LuisIntent(“问候,欢迎”)]
公共异步任务查询PN(IDialogContext上下文、IAwaitable活动、LuisResult LuisResult)
{
AdaptiveCard gpnCard=新的AdaptiveCard();
gpnCard.Body.Add(新的TextBlock()
{
Text=“GPN查找表单”,
Size=TextSize.Large,
重量=文本重量。加粗
});
TextInput gpnInput=new TextInput()
{
Id=“GPN”,
IsMultiline=false
};
gpnCard.Body.Add(gpnInput);
gpnCard.Actions.Add(新SubmitAction())
{
Title=“提交”
});
附件gpnCardAttachment=新附件()
{
ContentType=AdaptiveCard.ContentType,
内容=gpnCard
};
IMessageActivity gpnFormMessage=context.MakeMessage();
gpnFormMessage.Attachments=新列表();
gpnFormMessage.Attachments.Add(gpnCardAttachment);
wait context.PostAsync(gpnFormMessage);
context.Wait(this.MessageReceived);
}
[路易辛顿(“诅咒”)]
公共异步任务诅咒(IDialogContext上下文、IAwaitable活动、LuisResult LuisResult)
{
控制台。写线(“诅咒”);
wait context.PostAsync($“诅咒”);
context.Wait(this.MessageReceived);
}
情况是,我将在文本输入上输入诅咒,我希望机器人将重定向到“诅咒”Luisint
TQVM处于高级状态。我认为问题是因为您使用的是
LuisDialog
,并且您希望从自适应卡片的提交操作发送的值被对话框用作LUIS
的输入
围绕这一点的主要问题是,提交操作的值不在(新)活动的文本
属性中,而是在值
属性中。我怀疑正是由于这个原因,您得到了NullReference
异常,因为LuisDialog
使用该属性提取要发送给LUIS的值
好消息是解决这个问题应该非常简单。在幕后,LuisDialog
调用该方法从IMessageActivity
中提取文本,该文本将被发送到LUIS
。这种情况发生在方法上
因此,我相信通过重写该方法,您应该能够更新逻辑并从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);
}
}
受保护的覆盖任务GetLuisQueryTextAsync(IDialogContext上下文,IMessageActivity消息)
{
if(message.Value!=null)
{
动态值=message.value;
//假设您的DataJson具有如下类型属性:
//DataJson=“{\'Type\”:\“Curse\”}
字符串submitType=value.Type.ToString();
返回Task.FromResult(submitType);
}
其他的
{
//没有自适应卡值,让我们调用基础
返回base.GetLuisQueryTextAsync(上下文,消息);
}
}
上面的代码假设您的SubmitAction
有一个DataJson
属性,其值为“{\”Type\”:\“Curse\”}”
,但当然,您可以更新该属性
更多资源
不清楚你在问什么。你能详细说明一下你的功能性案例吗?您希望在卡中显示什么?看起来你在混合东西。你通过TextInput提交信息后收到的活动是否有数据属性?我只是根据我对scenario@NicolasR这不是卡的问题。情况是,我会将文本输入AdaptiveCard textInput,我希望它能够达到Luis的目的之一。在这种情况下,我会把诅咒放进去,然后LuisIntent(“诅咒”)会被击中。我使用SubmitAction按钮的DataJson属性,这将填充Activity的value属性。据我所知,Luis不会读取活动的value属性,而是text属性,因此我不会被击中LuisIntent@StevenG. 是的。textInput文本填写在activity的'Value'属性中。“我怀疑正是因为这个原因,您得到了一个NullReference异常,因为LuisDialog使用该属性提取要发送给LUIS的值。”-是的。这正是我遇到的问题。谢谢你的回答。我发现的另一件事是,当我使用SubmitAction按钮的'Data'属性时,textInput值将填充到新操作的'Text'属性中,并点击Luisint。所以对于数据和datajson之间的区别有点困惑。