Ответ с картой героя в методе после формы в Bot Framework с #

У меня есть диалоговое окно, из которого я запускаю форму, и я хотел бы отобразить карту героя после того, как форма будет заполнена пользователем. Я запускаю форму с помощью кода ниже, а также назначаю метод после формы.

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);
}

Проблема в том, что для отправки ответа на карту героя пользователю мне нужен объект активности, который недоступен в методе AfterMenuForm. Есть ли способ раскрыть объект активности в этом методе?


person marek_lani    schedule 23.03.2017    source источник


Ответы (1)


Вы можете использовать IDialogContext для создания нового IMessageActivity и отправки HeroCard.

Попробуйте context.MakeMessage();. Получив сообщение, вы можете просто использовать его для отправки открытки. Вам не нужно выполнять CreateReply над этим сообщением, в этом нет необходимости.

Кроме того, в зависимости от сценария вы можете получить доступ к исходному действию. Это доступно на context.Activity.

Наконец, я не уверен, почему вы используете Chain.From; вы должны просто использовать:

var startFormDialog = FormDialog.FromForm(StartForm.BuildForm, FormOptions.PromptInStart));    
context.Call<StartForm>(startFormDialog,AfterMenuForm);
person Ezequiel Jadib    schedule 23.03.2017
comment
Привет, @EzequielJadib, я уже пробовал метод MakeMessage (), однако я получил это исключение при попытке PostAsync HeroCard .: {'activityId' не может быть нулевым.}. По-видимому, активность отсутствует в контексте, когда вызывается метод обратного вызова AfterMenuForm. Более того, свойство context.Activity не существует в IDialogContext. Пожалуйста, есть ли другой способ решить эту проблему? Я добавил реализацию метода AfterMenuForm в исходный пост. А также спасибо за совет с Chain.Form. - person marek_lani; 24.03.2017
comment
Какую версию NuGet BotBuilder вы используете? Вам не нужно выполнять CreateReply. Просто используйте сообщение, созданное с помощью MakeMessage. Йо тоже не нужно заполнять получателя - person Ezequiel Jadib; 24.03.2017
comment
Спасибо, Эсекьель. Я использую v 3.0. Это сработало, когда я использовал сообщение, полученное из MakeMessage, без CreateReply. Добавьте этот комментарий к своему ответу, и я отмечу его как правильный. - person marek_lani; 26.03.2017
comment
Хорошо, подредактирую ответ. Рассмотрите возможность обновления до версии 3.5.5 - person Ezequiel Jadib; 26.03.2017