c# - 当我在瀑布对话框中使用自适应卡片的输入形式时,ContinueDialogAsync 不起作用
问题描述
我一直在使用 EchoBot 模板,最近使用了 VirtualAssistant 模板。在之前的模板中,提交输入表单数据是没有问题的,但是这个模板不支持仅提交输入表单数据的 ContinueDialogAsync。我们如何解决这个问题?请帮我。
WaterfallStep的输入形式
card.Body.Add(new AdaptiveTextBlock()
{
HorizontalAlignment = AdaptiveHorizontalAlignment.Left,
Spacing = AdaptiveSpacing.None,
Size = AdaptiveTextSize.Small,
Weight = AdaptiveTextWeight.Bolder,
Color = AdaptiveTextColor.Accent,
Text = Common.PurchaseDialog_DepartureDate
});
card.Body.Add(new AdaptiveDateInput()
{
Id = "GoDateVal",
Value = DateTime.Now.AddDays(4).ToString("yyyy-MM-dd"),
Spacing = AdaptiveSpacing.None
});
if (lowestPriceQuery.tripType == "RT")
{
card.Body.Add(new AdaptiveTextBlock()
{
HorizontalAlignment = AdaptiveHorizontalAlignment.Left,
Spacing = AdaptiveSpacing.None,
Size = AdaptiveTextSize.Small,
Weight = AdaptiveTextWeight.Bolder,
Color = AdaptiveTextColor.Accent,
Text = Common.PurchaseDialog_CommingDate
});
card.Body.Add(new AdaptiveDateInput()
{
Id = "ComeDateVal",
Value = DateTime.Now.AddDays(8).ToString("yyyy-MM-dd"),
Spacing = AdaptiveSpacing.None,
});
}
if (lowestPriceQuery.tripType == "DS")
{
card.Body.Add(new AdaptiveTextBlock()
{
HorizontalAlignment = AdaptiveHorizontalAlignment.Left,
Spacing = AdaptiveSpacing.None,
Size = AdaptiveTextSize.Small,
Weight = AdaptiveTextWeight.Bolder,
Color = AdaptiveTextColor.Accent,
Text = "ReturnDate"
});
card.Body.Add(new AdaptiveDateInput()
{
Id = "ComeDateVal",
Value = DateTime.Now.AddDays(8).ToString("yyyy-MM-dd"),
Spacing = AdaptiveSpacing.None,
});
}
card.Actions.Add(new AdaptiveSubmitAction()
{
Type = AdaptiveSubmitAction.TypeName,
Title = "submit",
Id = "submit",
});
reply.Attachments = new List<Attachment>
{
new Attachment()
{
ContentType = "application/vnd.microsoft.card.adaptive",
Content = JsonConvert.DeserializeObject(JsonConvert.SerializeObject(card))
}
};
await turnContext.SendActivityAsync(reply, cancellationToken: cancellationToken);
对话机器人,
调试时,var result = await dc.ContinueDialogAsync ();
从输入表单提交时没有任何反应。
var dc = await _dialogs.CreateContextAsync(turnContext);
if (turnContext.Activity.Type == ActivityTypes.Message)
{
// Ensure that message is a postBack (like a submission from Adaptive Cards)
var channelData = JObject.Parse(dc.Context.Activity.ChannelData.ToString());
if (channelData.ContainsKey("postback"))
{
var postbackActivity = dc.Context.Activity;
// Convert the user's Adaptive Card input into the input of a Text Prompt
// Must be sent as a string
postbackActivity.Text = postbackActivity.Value.ToString();
await dc.Context.SendActivityAsync(postbackActivity);
}
}
if (dc.ActiveDialog != null)
{
var result = await dc.ContinueDialogAsync();
}
else
{
await dc.BeginDialogAsync(typeof(T).Name);
}
解决方案
您需要删除:
await dc.Context.SendActivityAsync(postbackActivity);
当 bot 发送消息时,它会将对话标记为已得到响应,并且无法正常继续。
此外,您的“//确保消息是回发”代码应该更像这样:
var activity = turnContext.Activity;
if (activity.Type == ActivityTypes.Message)
{
if (string.IsNullOrWhiteSpace(activity.Text) && activity.Value != null)
{
activity.Text = JsonConvert.SerializeObject(activity.Value);
}
}
我相信您从我的旧答案中获得了该代码,此后我对其进行了改进。
推荐阅读
- javascript - 如何从 controlBar 组件中删除两个自定义按钮
- android - Firebase 未向移动设备发送身份验证代码以进行移动验证
- sql-server - SSRS 中的空单元格给出随机值
- javascript - 你能在 Kendo UI 中制作一个包含多个字段的过滤器吗?
- javascript - React Redux SSR saga run saga promise
- npm - 电子js中每秒有最大reqest()调用限制吗?
- android - 从 androidretrofit 到 laravelwebapi 的登录请求,java.lang.illegalStateException: 例外 BEGAIN_OBJECT 但在第 1 行第 1 列路径 $
- javascript - Node.js - FCM 发送预定主题通知
- html - 延迟流中帧的渲染角度 7
- typoscript - 日期转换为时间戳并转换为另一种日期格式