Как в Adaptive Card включить ToggleVisibility при отправке пользователем?

В Adaptive Card легко создать кнопку отправки:

{
  "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
  "type": "AdaptiveCard",
  "version": "1.0",
  "body": [
    {
      "type": "TextBlock",
      "text": "Present a form and submit it back to the originator"
    },
    {
      "type": "Input.Text",
      "id": "firstName",
      "placeholder": "What is your first name?"
    },
    {
      "type": "Input.Text",
      "id": "lastName",
      "placeholder": "What is your last name?"
    }
  ],
  "actions": [
    {
      "type": "Action.Submit",
      "title": "Action.Submit",
      "data": {
        "x": 13
      }
    }
  ]
}

Которые выглядят так:

введите здесь описание изображения

Можно ли также использовать Toggle Visibility, как определено здесь?

https://adaptivecardsci.z5.web.core.windows.net/pr/3261/explorer/Action.ToggleVisibility.html

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


person Bill Software Engineer    schedule 02.03.2020    source источник
comment
Привет, Билл, это, к сожалению, не сработает. Кнопка действия может быть только одного типа и выполнять только одно действие за раз. Где вы показываете свою карточку? Команды MS, веб-чат? Может быть, есть другие варианты для достижения желаемого.   -  person Tim Cadenbach    schedule 03.03.2020
comment
Привет, Тим, в настоящее время я показываю это в команде MS.   -  person Bill Software Engineer    schedule 03.03.2020
comment
В MS Teams у вас есть возможность обновить карту после того, как вы ее отправили. Вы можете просто отправить пустую карточку (или как хотите, чтобы она выглядела) после того, как пользователь нажал кнопку.   -  person Tim Cadenbach    schedule 04.03.2020
comment
@BillSoftwareEngineer - Вы отправляете карточку от бота? Если да, то на каком языке написан бот? (Поскольку в этой теме участвует несколько человек, вам нужно @ упомянуть меня, если вы хотите, чтобы я увидел ваш ответ.)   -  person Kyle Delaney    schedule 05.03.2020
comment
@KyleDelaney Я отправляю карточку от бота, используя C #. Возможность обновить карту работает только в MS Team и не работает в эмуляторе.   -  person Bill Software Engineer    schedule 05.03.2020
comment
@BillSoftwareEngineer - Ожидаете ли вы, что ваши клиенты будут взаимодействовать с вашим ботом в эмуляторе? Почему вас беспокоит то, что работает в эмуляторе?   -  person Kyle Delaney    schedule 05.03.2020
comment
@KyleDelaney Вы правы, я не прав, я могу использовать его, но я, конечно, предпочел бы, чтобы я также мог отлаживать в эмуляторе.   -  person Bill Software Engineer    schedule 05.03.2020
comment
Приемлем ли мой ответ?   -  person Kyle Delaney    schedule 07.03.2020
comment
Привет, Кайл, да! Спасибо за подробный ответ.   -  person Bill Software Engineer    schedule 10.03.2020


Ответы (1)


Эмулятор не поддерживает обновление или удаление сообщений, поэтому вы не сможете протестировать эту функцию в эмуляторе. Однако вы все равно можете отлаживать своего бота локально на канале, таком как Teams, с помощью службы туннелирования, например ngrok: https://blog.botframework.com/2017/10/19/debug-channel-locally-using-ngrok/

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

Вы можете видеть, что это связано с состоянием бота. Если вы просто хотите удалить все действие, ваша работа может быть проще, потому что вам не нужно будет сохранять какую-либо информацию о действиях, кроме идентификатора действия. Ваш метод доступа к состоянию может выглядеть так:

public IStatePropertyAccessor<Dictionary<string, string>> CardStateAccessor { get; internal set; }

И инициализировать его можно так:

CardStateAccessor = _conversationState.CreateProperty<Dictionary<string, string>>("cardState");

Поскольку ваша карта находится в форме JSON, вы можете десериализовать ее перед добавлением уникального идентификатора карты в действие отправки:

var card = JObject.Parse(json);
var data = card.SelectToken("actions[0].data");
var cardId = Guid.NewGuid();

data[KEYCARDID] = cardId;

var cardActivity = MessageFactory.Attachment(new Attachment("application/vnd.microsoft.card.adaptive", content: card));
var response = await turnContext.SendActivityAsync(cardActivity, cancellationToken);
var dict = await CardStateAccessor.GetAsync(turnContext, () => new Dictionary<string, string>(), cancellationToken);

dict[cardId] = response.Id;

Затем вы можете удалить действие следующим образом:

var value = JObject.FromObject(turnContext.Activity.Value);
var cardId = Convert.ToString(value[KEYCARDID]);
var dict = await CardStateAccessor.GetAsync(turnContext, () => new Dictionary<string, string>(), cancellationToken);

if (dict.TryGetValue(cardId, out var activityId))
{
    await turnContext.DeleteActivityAsync(activityId, cancellationToken);

    dict.Remove(cardId);
}

Если вы хотите, чтобы этот процесс упростился, вы можете выразить свою поддержку предложения о моей библиотеке карточек: https://github.com/BotBuilderCommunity/botbuilder-community-dotnet/issues/137

person Kyle Delaney    schedule 06.03.2020