Не удается передать выбранное значение в главный диалог в рамках бота V4 C # - PullRequest
0 голосов
/ 09 июля 2019

У меня есть набор адаптивных карт, которые показываются при загрузке бота. На action.submit я могу получить значение карты, выбранной пользователем, но не могу передать это значение на следующий шаг в главном диалоговом окне.

OnTurnAsync следующий код написан:

public override async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken))
    {
        await base.OnTurnAsync(turnContext, cancellationToken);
        var activity = turnContext.Activity;

        if (string.IsNullOrWhiteSpace(activity.Text) && activity.Value != null)
        {
            activity.Text = JsonConvert.SerializeObject(activity.Value);
        }

        // Save any state changes that might have occured during the turn.
        await ConversationState.SaveChangesAsync(turnContext, false, cancellationToken);
        await UserState.SaveChangesAsync(turnContext, false, cancellationToken);
        switch (activity.Text)
        {
            case "{\"choice\":1}":
                break;
            case "{\"choice\":2}":
               // var msg = $"Platform Assistance";
               // await turnContext.SendActivityAsync(MessageFactory.Text(msg), cancellationToken);
                var welcomeCard = CreateAdaptiveCardAttachment();
                var response = CreateResponse(turnContext.Activity, welcomeCard);
                await turnContext.SendActivityAsync(response, cancellationToken);
                //var response = CreateResponse(turnContext.Activity, welcomeCard);
                break;
        }
        await turnContext.SendActivityAsync(activity, cancellationToken);
    }

А в главном диалоге

private async Task<DialogTurnResult> HandleResponseAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
    {
        var userResult = stepContext.Result;              

        await stepContext.Context.SendActivityAsync($"INPUT: {stepContext.Result}");
        return await stepContext.NextAsync();
    }

Я ожидаю, что я получу выбор, выбранный пользователем, как только будут показаны все карты, которые будут в дальнейшем переданы намерениям LUIS

Я также пытался использовать текстовое приглашение, но код, похоже, не входит в метод HandleResponseAsync.

1 Ответ

0 голосов
/ 09 июля 2019

У вас есть пара проблем.

Главный

Вы звоните слишком рано:

// Save any state changes that might have occured during the turn.
await ConversationState.SaveChangesAsync(turnContext, false, cancellationToken);
await UserState.SaveChangesAsync(turnContext, false, cancellationToken);

Они должны быть самыми последними в OnTurnAsync(). Переместите их до конца, и ответ пользователя перейдет к следующему шагу.

Дополнительный

await turnContext.SendActivityAsync(activity, cancellationToken);

У вас есть это в конце OnTurnAsync(), что заставит его выглядеть так, будто все, что происходит от бота, исходит от пользователя. Просто удалите его.

Ресурсы

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

Я также написал AdaptiveCardPrompt , который вы могли бы использовать вместо текста / выбора. Заставить его работать в C # немного сложно, так как некоторые классы internal / protected. Вам нужно будет либо изменить некоторые из констант с Prompt, либо разветвить Dotnet SDK . Не рекомендуется. У меня также есть семплов , которые используют AdaptiveCardPrompt. Опять же, C # имеет проблемы. Надеюсь, что это скоро будет в SDK, но это все еще TBD.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...