我正在尝试从MainDialog
运行一个瀑布对话框。看来,当我运行await dc.BeginDialogAsync(nameof(OnboardingDialog));
时,我就进入了OnboardingDialog
的第一步,这很好。但是,当我响应该对话框中的第一个提示时,我将返回到我的RouteDialog
中。看来原因是因为在我的DialogBot.cs
的{{1}}方法中,OnTurnAsync
等于dc.ActiveDialog
,因此我的null
被调用了再次。这是我的MainDialog
:
OnTurnAsync
从 public override async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken))
{
var dc = await _dialogs.CreateContextAsync(turnContext);
if (dc.ActiveDialog != null)
{
var result = await dc.ContinueDialogAsync();
}
else
{
await dc.BeginDialogAsync(typeof(T).Name);
}
// Save any state changes that might have occured during the turn.
await ConversationState.SaveChangesAsync(turnContext, false, cancellationToken);
await UserState.SaveChangesAsync(turnContext, false, cancellationToken);
}
调用MainDialog
时,它会触发await dc.BeginDialogAsync(typeof(T).Name)
方法,该方法可以简化为:
RouteAsync
然后,当我对protected override async Task RouteAsync(DialogContext dc, CancellationToken cancellationToken = default(CancellationToken))
{
await dc.BeginDialogAsync(nameof(OnboardingDialog));
}
中的第一步做出响应时,由于OnboardingDialog
为空,我只是再次点击了await dc.BeginDialogAsync(typeof(T).Name);
,而不是继续我的对话dc.ActiveDialog
我已经尝试了一些通过访问器创建的var result = await dc.ContinueDialogAsync()
上具有保存/设置状态的操作,但是似乎没有什么使我的机器人意识到它应该在瀑布对话框中。我可以共享项目,但不能在公共场所共享。让我知道是否有人提示如何保存DialogState
的状态。谢谢。
答案 0 :(得分:1)
OP在评论中提到它仅在Cosmos中发生。因此,here's another user who just experienced this。
然后,the answer。
现在,如果您从
CosmosDbStorageOptions
中删除了$(".msg-payload").text(atob($(".msg-payload").text()))
参数,它应该可以工作。由于您的容器当前已分区,您可能需要删除您的容器或使用其他名称。最简单的方法就是删除您的容器,然后让机器人为您创建一个容器。提供了partitionKey时,所有Bot Builder SDK中目前都存在一个从分区数据库读取数据的错误。 Tracking the issue here