在自适应卡片中,用户提交时如何切换可见性?

In Adaptive Card, how can I ToggleVisibility when user submit?

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

看起来像这样:

是否也可以使用此处定义的切换可见性?

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

所以我想实现的是当用户单击按钮时,它会提交表单并使表单元素不可见。

模拟器不支持消息更新或删除,因此您将无法在模拟器中测试此功能。但是,您仍然可以使用 ngrok 等隧道服务在 Teams 等频道上本地调试您的机器人:https://blog.botframework.com/2017/10/19/debug-channel-locally-using-ngrok/

您可以在以下答案中找到有关如何更新活动的示例:

可以看到涉及bot状态。如果您只想删除整个 activity,那么您的工作可能会更容易,因为除了 activity ID 之外,您不需要保存有关活动的任何信息。您的状态访问器可能如下所示:

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

你可以这样初始化它:

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

由于您的卡片采用 JSON 形式,您可能需要在将唯一的卡片 ID 添加到提交操作之前对其进行反序列化:

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;

然后你可以像这样删除activity:

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