Как ждать ввода пользователя при использовании адаптивных карт в SDK4 - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь проанализировать адаптивную карту, используя Waterfallstep в шаблоне Virtual Assistant, он не ждет ввода данных пользователем в карту.Приведенный ниже код работал, когда я использовал шаблон Multiprompt, но он не работал в шаблоне Virtual Assistant.

private async Task<DialogTurnResult> 
StartTheDialogAsync(WaterfallStepContext sc, CancellationToken 
cancellationToken)
{
 var attachment = CreateAdaptiveCardAttachment(cards);
 var replyMessage = sc.Context.Activity.CreateReply();
 replyMessage.Attachments.Add(attachment);
 await sc.Context.SendActivityAsync(replyMessage, cancellationToken);
 return new DialogTurnResult(DialogTurnStatus.Waiting);
 }

1 Ответ

0 голосов
/ 14 июня 2019

В Bot Framework нет ничего, что заставляло бы диалоговое окно ждать ввода пользователя после отправки адаптивной карты. Я предполагаю, что он работает в образце MultiPrompt по совпадению из-за того, как образец закодирован.

Два способа заставить ждать:

  1. Отправить пустое текстовое приглашение сразу после адаптивной карты
  2. Отправить адаптивную карточку в виде вложения к пустому текстовому приглашению

См. Любой из этих ответов для более подробной информации:

Вам, по сути, нужны два фрагмента кода:

private async Task<DialogTurnResult> DisplayCardAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
    // Create the Adaptive Card
    var cardPath = Path.Combine(".", "AdaptiveCard.json");
    var cardJson = File.ReadAllText(cardPath);
    var cardAttachment = new Attachment()
    {
        ContentType = "application/vnd.microsoft.card.adaptive",
        Content = JsonConvert.DeserializeObject(cardJson),
    };

    // Create the text prompt
    var opts = new PromptOptions
    {
        Prompt = new Activity
        {
            Attachments = new List<Attachment>() { cardAttachment },
            Type = ActivityTypes.Message,
            Text = "waiting for user input...", // You can comment this out if you don't want to display any text. Still works.
        }
    };

    // Display a Text Prompt and wait for input
    return await stepContext.PromptAsync(nameof(TextPrompt), opts);
}

private async Task<DialogTurnResult> HandleResponseAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
    // Do something with step.result
    // Adaptive Card submissions are objects, so you likely need to JObject.Parse(step.result)
    await stepContext.Context.SendActivityAsync($"INPUT: {stepContext.Result}");
    return await stepContext.NextAsync();
}

и

var activity = turnContext.Activity;

if (string.IsNullOrWhiteSpace(activity.Text) && activity.Value != null)
{
    activity.Text = JsonConvert.SerializeObject(activity.Value);
}

Снова, прочитайте связанные ответы для более подробной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...