Диалог не продолжается с того места, где он ожидал ввода пользователя - PullRequest
0 голосов
/ 01 февраля 2019

Этот код использует botframework 4

У меня есть rootdialog, который вызывает другой диалог с именем choicedialog. Из choicedialog я возвращаю DialogturnResult (ожидание) из метода BeginDialogAsync. После этого бот ожидает вводаот пользователя.когда пользователь вводит что-то, он должен вызывать метод ContinueAsync в ChoiceDialog. Но бот вызывает Rootdailog ContinueAsync.что является причиной этого? Как я могу решить это?

в методе Controller onTurnAync

async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken)
    {
        if (turnContext.Activity.Type == ActivityTypes.Message)
        {

                var dc = await Dialogs.CreateContextAsync(turnContext, cancellationToken);
                var dialogResult = await dc.ContinueDialogAsync();

                if (!dc.Context.Responded)
                {
                    // examine results from active dialog
                    switch (dialogResult.Status)
                    {
                        case DialogTurnStatus.Empty:
                            await dc.BeginDialogAsync(nameof(RootDialog));
                            break;

                        case DialogTurnStatus.Waiting:
                            // The active dialog is waiting for a response from the user, so do nothing.
                            break;

                        case DialogTurnStatus.Complete:
                            await dc.EndDialogAsync();
                            break;

                        default:
                            await dc.CancelAllDialogsAsync();
                            break;
                    }
                }
        }
    }

rootDialog

public override async Task<DialogTurnResult> BeginDialogAsync(DialogContext context, object options = null, CancellationToken cancellationToken = default(CancellationToken))
    {
        var activity = context.Context.Activity;
        context.SendTyping(activity);
            var response = DataFromService();
            if (response == null || response.StatusCode != 1)
            {
                await context.PostAsync(Messages.StandardErrorMessage);

            }

            if (response.Data != null)
            {

                return await dialog.BeginDialogAsync(context);

            }
            else
            {
                return new DialogTurnResult(DialogTurnStatus.Waiting);
            }

    }

ChoiceDialog

public override async Task<DialogTurnResult> BeginDialogAsync(DialogContext context, object options = null, CancellationToken cancellationToken = default(CancellationToken))
    {
        choiceStep.SaveEntityDataInContext(context: context);

        IList<IMessageActivity> messages = GenerateMessageActivity(context);

        if (messages.IsCollectionValid())
        {
            foreach (var message in messages)
            {
                await context.PostActivityToUser(message);
            }
        }
        var dialogResult = new DialogTurnResult(DialogTurnStatus.Waiting);
        return dialogResult;
    }

1 Ответ

0 голосов
/ 03 февраля 2019

Я не вижу, чтобы вы сохраняли изменения в DialogState.Обычно это делается в конце OnTurnAsync.Возможно, вы могли бы использовать AutoSaveStateMiddleware, но вы не упомянули об этом (и, честно говоря, я бы не рекомендовал это).

В частности, вам нужно вызвать SaveChangesAsync в экземпляре BotState, которыйты позвонил CreateProperty<DialogState>.Обычно это ConversationState.

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

...