在自适应卡片中,用户提交时如何切换可见性?
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
在 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