C# 如何在BotFramework上设置AdaptiveCard Submit按钮操作的文本值

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

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