C# 在Bot框架c中用after-form方法回复英雄卡#

C# 在Bot框架c中用after-form方法回复英雄卡#,c#,bots,botframework,C#,Bots,Botframework,我有一个对话框,从中我开始表单,我想在用户完成表单后显示英雄卡。我用下面的代码开始表单,并指定after-form方法 var startFormDialog = Chain.From(() => FormDialog.FromForm(StartForm.BuildForm, FormOptions.PromptInStart)); context.Call<StartForm>(startFormDialog,AfterMenuForm); //AfterMenu

我有一个对话框,从中我开始表单,我想在用户完成表单后显示英雄卡。我用下面的代码开始表单,并指定after-form方法

var startFormDialog = Chain.From(() => FormDialog.FromForm(StartForm.BuildForm, FormOptions.PromptInStart));    
context.Call<StartForm>(startFormDialog,AfterMenuForm);

//AfterMenuForm method implementation
private async Task AfterMenuForm(IDialogContext context, IAwaitable<StartForm> result)
{
    message = (Activity)context.MakeMessage();
    Activity replyToConversation = message.CreateReply("Should go to conversation, with a hero card");
     replyToConversation.Recipient = message.From;
     replyToConversation.Type = "message";
     replyToConversation.Attachments = new List<Attachment>();
     //List<CardImage> cardImages = new List<CardImage>();
     replyToConversation.AttachmentLayout = "carousel";
     List<CardAction> cardButtons = new List<CardAction>();
     CardAction plButton = new CardAction()
     {
         Value = "https://en.wikipedia.org/wiki/Pig_Latin",
         Type = "openUrl",
         Title = "WikiPedia Page"
     };
     cardButtons.Add(plButton);
     HeroCard plCard = new HeroCard()
     {
         Title = "I'm a hero card",
         Subtitle = "Pig Latin Wikipedia Page",
         //Images = cardImages,
                    Buttons = cardButtons
      };
      Attachment plAttachment = plCard.ToAttachment();
      replyToConversation.Attachments.Add(plAttachment);
      await context.PostAsync(replyToConversation);
}
var startFormDialog=Chain.From(()=>FormDialog.FromForm(StartForm.BuildForm,FormOptions.prompinstart));
调用(startFormDialog,AfterMenuForm);
//后继形式方法实现
私有异步任务AfterMenuForm(IDialogContext上下文,IAwaitable结果)
{
message=(活动)context.MakeMessage();
Activity replyToConversation=message.CreateReply(“应该使用英雄卡进入对话”);
replyToConversation.Recipient=message.From;
replyToConversation.Type=“message”;
replyToConversation.Attachments=新列表();
//List cardImages=新列表();
replyToConversation.AttachmentLayout=“旋转木马”;
列表卡片按钮=新列表();
CardAction plButton=新的CardAction()
{
值=”https://en.wikipedia.org/wiki/Pig_Latin",
Type=“openUrl”,
Title=“维基百科页面”
};
添加(plButton);
HeroCard plCard=新HeroCard()
{
Title=“我是英雄卡”,
Subtitle=“Pig拉丁语维基百科页面”,
//图像=心脏图像,
按钮=卡片按钮
};
附件plAttachment=plCard.ToAttachment();
replyToConversation.Attachments.Add(拼盘);
wait context.PostAsync(replyToConversation);
}

问题是,为了能够向用户发送英雄卡答案,我需要活动对象,而这在AfterMenuForm方法中不可用。是否有办法在此方法中显示活动对象?

您可以使用
IDialogContext
创建新的
IMessageActivity
并发送
HeroCard

尝试
context.MakeMessage()。一旦你有了信息,你就可以用它来发送卡片。您不需要对该消息执行CreateReply,这是不必要的

此外,根据场景,您可能需要访问原始活动的内容。可在
context.Activity
上找到

最后,我不知道你为什么要用Chain.From;您应该只使用:

var startFormDialog = FormDialog.FromForm(StartForm.BuildForm, FormOptions.PromptInStart));    
context.Call<StartForm>(startFormDialog,AfterMenuForm);
var startFormDialog=FormDialog.FromForm(StartForm.BuildForm,FormOptions.PromptInStart));
调用(startFormDialog,AfterMenuForm);

Hi@EzequielJadib,我已经尝试了MakeMessage()方法,但是在尝试对HeroCard进行后期同步时出现了此异常。{“'activityId'不能为null。”}。显然,调用回调AfterMenuForm方法时,上下文中不存在该活动。此外,IDialogContext中不存在context.Activity属性。请问还有别的办法解决这个问题吗?我在原来的帖子中添加了AfterMenuForm方法实现。同时也感谢您对Chain.Form的建议。您使用的是哪个版本的BotBuilder nuget?您不需要执行CreateReply。只需使用MakeMessage创建的消息。你不需要填写收件人,谢谢你。我正在使用v3.0。当我在没有CreateReply的情况下使用从MakeMessage获得的消息时,它起作用了。请将此评论添加到您的答案中,我会将其标记为正确。好的,我将编辑答案。考虑更新到V3.5.5