Как обнаружить / прослушать action.submit с адаптивной карты - PullRequest
0 голосов
/ 17 ноября 2018

Я использую botframework (шаблон корпоративного бота) и LUIS.ai:

Моя проблема в том, что, когда я заполняю настраиваемую адаптивную карточку (в ней три поля для ввода текста) и нажимаю «Отправить», я получаю следующее сообщение: «Извините, я не могу помочь с этим». Я вижу в эмуляторе, что кнопка «Отправить» отправляет введенные значения обратно, но я не уверен, как мне прослушивать действие кнопки. Я думаю, что мне нужно прослушивать, когда вызывается идентификатор действия, но я Я не совсем уверен, как это сделать.

Ниже приведен код, вызывающий диалоговое окно:

    public static IMessageActivity SendTicketFormCard(ITurnContext turnContext, dynamic data)
    {
        var response = turnContext.Activity.CreateReply();
        var introcard = File.ReadAllText(@".\dialogs\main\resources\Ticket_Fields.json");

        response.Attachments = new List<Attachment>();
        response.Attachments.Add(new Attachment()
        {
            ContentType = "application/vnd.microsoft.card.adaptive",
            Content = JsonConvert.DeserializeObject(introcard),
        });

        return response;
    }

Где диалоговое окно JSON выглядит так:

{
  "type": "AdaptiveCard",
  "body": [
    {
      "type": "TextBlock",
      "horizontalAlignment": "Center",
      "size": "Medium",
      "weight": "Bolder",
      "color": "Dark",
      "text": "Search Ticket"
    },
    {
      "type": "TextBlock",
      "id": "94358428-5ef2-43a5-9056-d3cac1abfabd",
      "text": "Ticket ID:",
      "maxLines": 1
    },
    {
      "type": "Input.Text",
      "id": "68e1e180-4cdc-4ad6-bb8f-743554f1f58b",
      "placeholder": "Ticket ID (required)",
      "maxLength": 10
    },
    {
      "type": "TextBlock",
      "id": "2da1df9d-7f61-4e5c-9ff9-7aba2c5b306b",
      "text": "Summary:",
      "maxLines": 1
    },
    {
      "type": "Input.Text",
      "id": "403979a3-ccba-4baa-a885-2abca754cc69",
      "placeholder": "Summary (optional)",
      "maxLength": 250,
      "isMultiline": true
    },
    {
      "type": "TextBlock",
      "id": "a25464c7-07ea-4270-995f-5e57b783b52d",
      "text": "Status:",
      "maxLines": 1
    },
    {
      "type": "Input.Text",
      "id": "7794d725-feb5-4516-9786-d18684892106",
      "placeholder": "Status (optional)",
      "maxLength": 30
    }
  ],
  "actions": [
    {
      "type": "Action.Submit",
      "id": "783fe2e4-4056-449e-8cc6-5dc9c406222a",
      "title": "Search"
    }
  ],
  "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
  "version": "1.0"
}

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Когда вы нажимаете кнопку «Отправить» на адаптивной карте, канал отправляет обратный токен «postback»: «true» в объекте данных канала. Наряду с этим данные, настроенные для кнопки отправки, отправляются в объекте Value в json. Вам необходимо проанализировать это значение, чтобы получить подробную информацию, необходимую для дальнейших действий. Я опубликовал пост об этом. Пожалуйста, проверьте это на Реактивные адаптивные карты BotFramework: как читать данные о кнопках действий в адаптивных картах

0 голосов
/ 21 ноября 2018

Сообщение "Извините, я не могу помочь с этим."является ответом на намерение LUIS «Нет» в классе MainDialog корпоративного шаблона.Вы можете найти сообщение в MainStrings.resx .

Действие отправки адаптивной карты отправляет сообщение без текста в бот, а затем LUIS пытается интерпретировать намерение этого сообщения, используятекст сообщения, но текст отсутствуетПредставленные данные будут содержаться в свойстве Value действия.Чтобы прочитать данные из свойства Value, вам необходимо использовать идентификаторы полей ввода карты в качестве ключей.

private const string TICKETFIELD = "68e1e180-4cdc-4ad6-bb8f-743554f1f58b";
private const string SUMMARYFIELD = "403979a3-ccba-4baa-a885-2abca754cc69";
private const string STATUSFIELD = "7794d725-feb5-4516-9786-d18684892106";

Вам нужно будет проверить входящие сообщения, чтобы убедиться, что в них нет текста.и затем ответьте, как будто это возможное действие отправки.Вы можете сделать это, как только LUIS уже определил намерение «Нет», но вы можете также выполнить проверку до того, как сообщение будет отправлено в LUIS.Перейдите к методу RouteAsync вашего MainDialog и оберните весь существующий код в блок else, а затем вы можете поместить код, который отвечает на действие отправки, в ваш блок if:

protected override async Task RouteAsync(DialogContext dc, CancellationToken cancellationToken = default(CancellationToken))
{
    if (string.IsNullOrEmpty(activity.Text))
    {
        dynamic value = dc.Context.Activity.Value;

        await turnContext.SendActivityAsync($"Ticket = {value[TICKETFIELD]}, Summary = {value[SUMMARYFIELD]}, Status = {value[STATUSFIELD]}");
    }
    else
    {
        // All the code that was already there
    }
}
...