Как я могу получить и получить результат адаптивной карты из выпадающего списка или контрольного списка - PullRequest
0 голосов
/ 08 апреля 2019

Я создал приложение LUIS Template Bot (версия 3), и мне нужно захватить выходные данные выпадающего списка Adaptive Card. В настоящее время я могу создать и отобразить раскрывающийся список, но столкнулся с трудностями при получении результата после нажатия кнопки. Можете ли вы дать мне решение или дать ссылку на соответствующий учебник для версии 3, поскольку ресурсы для этой проблемы в основном для версии 4.

public Attachment PolicyAdaptiveCard()
        {
            var card = new AdaptiveCard();
            var choices = new List<AdaptiveChoice>();
            choices.Add(new AdaptiveChoice()
            {
                Title = "Category 1",
                Value = "c1"
            });
            choices.Add(new AdaptiveChoice()
            {
                Title = "Category 2",
                Value = "c2"
            });
            var choiceSet = new AdaptiveChoiceSetInput()
            {
                IsMultiSelect = false,
                Choices = choices,
                Style = AdaptiveChoiceInputStyle.Compact,
                Id = "Category"
            };
            card.Body.Add(choiceSet);
            card.Actions.Add(new AdaptiveSubmitAction() { Title = "Select Category", Data = Newtonsoft.Json.Linq.JObject.FromObject(new { button = "select" }) });

            Attachment attachment = new Attachment()
            {
                ContentType = AdaptiveCard.ContentType,
                Content = card,
                Name = $"Card"
            };
            return attachment;
        }

Это вывод JSON, который я записываю в Bot Emmulator

{
  "channelData": {
    "clientActivityID": "15547009411880.yfus2yy2mao",
    "postBack": true
  },
  "channelId": "emulator",
  "conversation": {
    "id": "3f50f7c1-59be-11e9-98bd-17dcaa70e8d3|livechat"
  },
  "from": {
    "id": "r_tckd4zoa8h",
    "name": "User",
    "role": "user"
  },
  "id": "48d27080-59be-11e9-93ff-a77a4eb2d000",
  "localTimestamp": "2019-04-08T08:22:21+03:00",
  "locale": "en-US",
  "recipient": {
    "id": "97e06f60-496a-11e9-9541-3d37a55e03cc",
    "name": "Bot",
    "role": "bot"
  },
  "serviceUrl": "http://localhost:56373",
  "showInInspector": true,
  "timestamp": "2019-04-08T05:22:21.192Z",
  "type": "message",
  "value": {
    "Category": "c1",
    "button": "select"
  }
}

Как я могу прочитать значение и вывести «c1» в следующем методе? Это код, которому я следую. Можете ли вы дать мне метод, который я могу использовать для определения значения категории

var reply = context.MakeMessage();
            var activityValue = context.Activity.AsMessageActivity().Value as Newtonsoft.Json.Linq.JObject;
            if (activityValue != null)
            {
                var categorySelection = activityValue.ToObject<CategorySelection>();
                var category = categorySelection.Category;
                await context.PostAsync(reply);
            }

1 Ответ

0 голосов
/ 08 апреля 2019

Для фреймворка ботов v3 вы можете сделать что-то вроде этой функции обратного вызова:

private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)
{
    var activity = await result as Activity;

    if (activity.Value != null)
    {
        dynamic value = activity.Value;
        var category = value.Category;

        await context.PostAsync(category);
    }

    context.Wait(MessageReceivedAsync);
}

Используя динамику, очень легко получить доступ к значениям. Просто зарегистрируйте это сообщение как функцию обратного вызова на context.Wait в исходном приглашении, куда вы отправляете свою адаптивную карту.

Если вы хотите иметь более типизированную версию, вы можете смоделировать результат вашей карты и проанализировать его следующим образом:

private static string GetTypedCategoryFromAdaptiveCard(Activity activity)
{
    var content = JsonConvert.DeserializeObject<CategoryResponse>(activity.Value.ToString());
    return content.Category;
}

public class CategoryResponse
{
    public string Category { get; set; }
}
...