В адаптивной карте, как я могу ToggleVisibility, когда пользователь отправляет? - PullRequest
0 голосов
/ 03 марта 2020

В 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
      }
    }
  ]
}

Как это выглядит:

enter image description here

Можно ли также использовать видимость переключения, как определено здесь?

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

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

1 Ответ

1 голос
/ 06 марта 2020

Эмулятор не поддерживает обновления или удаления сообщений, поэтому вы не сможете проверить эту функцию в эмуляторе. Однако вы все равно можете отлаживать своего бота локально на канале, таком как Команды, используя сервис туннелирования, такой как 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

...