Обрабатывать значение действия отправки адаптивной карты во вложенных диалоговых окнах - PullRequest
0 голосов
/ 11 июля 2019

У меня есть чат-бот, созданный в C # с использованием SDK .net Core 2.2 Шаблон Virtual Assistant , который имеет 1 главное диалоговое окно и несколько диалоговых окон (диалоговое окно компонентов). Каждый диалог компонента вызывает другой диалог компонента. Допустим, у меня есть MainDialog, 2-компонентный диалог с именем ComponentDialog1, ComponentDialog2.

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

Код основного диалога: Я вызываю ComponentDialog1 в RouteAsync метод основного диалога.

protected override async Task RouteAsync(DialogContext dc, CancellationToken cancellationToken = default(CancellationToken))
{
    var triggerState = await _triggerStateAccessor.GetAsync(dc.Context, () => new DialogsTriggerState());
    await dc.BeginDialogAsync(nameof(ComponentDialog1), triggerState);
    var turnResult = EndOfTurn;
    if (turnResult != EndOfTurn)
    {
        await CompleteAsync(dc);
    }
}

ComponentDialog1 Код: У меня есть 3 этапа водопада, в которых 2-й шаг будет вызывать определенный «ComponentDialog» в зависимости от состояния бота. Предположим, я запускаю "ComponentDialog2".

private async Task<DialogTurnResult> TriggerToSpecificComponentDialogAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
    var triggerState = await _DialogsTriggerStateAccessor.GetAsync(stepContext.Context, () => null);

    if (triggerState.TriggerDialogId.ToString().ToLower() == "componentdialog2")
    {
        return await stepContext.BeginDialogAsync(nameof(ComponentDialog2), triggerState);
    }
    else if (triggerState.TriggerDialogId.ToString().ToLower() == "componentdialog3")
    {
        return await stepContext.BeginDialogAsync(nameof(ComponentDialog3), triggerState);
    }
    else
    {
        return await stepContext.NextAsync();
    }
}

ComponentDialog2 Код: У меня есть 2 шага водопада, который показывает адаптивные значения карты и выборки из карты и диалоговое окно завершения (ComponentDialog2)

private async Task<DialogTurnResult> DisplayCardAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
    // Display the Adaptive Card
    var cardPath = Path.Combine(".", "AdaptiveCard.json");
    var cardJson = File.ReadAllText(cardPath);
    var cardAttachment = new Attachment()
    {
        ContentType = "application/vnd.microsoft.card.adaptive",
        Content = JsonConvert.DeserializeObject(cardJson),
    };
    var message = MessageFactory.Text("");
    message.Attachments = new List<Attachment>() { cardAttachment };
    await stepContext.Context.SendActivityAsync(message, cancellationToken);

    // Create the text prompt
    var opts = new PromptOptions
    {
        Prompt = new Activity
        {
            Type = ActivityTypes.Message,
            Text = "waiting for user input...", // You can comment this out if you don't want to display any text. Still works.
        }
    };

    // Display a Text Prompt and wait for input
    return await stepContext.PromptAsync(nameof(TextPrompt), opts);
}

private async Task<DialogTurnResult> HandleResponseAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
    await stepContext.Context.SendActivityAsync($"INPUT: {stepContext.Result}");
   //I am doing some logic and may continue to next steps also from here, but as I am stuck here i am ending dialog.
    return await stepContext.EndDialogAsync();
}

Проблема: После нажатия адаптивной карты, отправленной в «ComponentDialog2» 1-го шага, код (элемент управления) не указывает на 2-й шаг «HandleResponseAsync», который должен произойти, как я предоставил, «Запрос» и ожидание вход.

Фактический вывод: Я не получаю ни вывода, ни ошибок в боте.

Ожидаемый результат:

1) Отображение боту из ComponentDialog2: ВВОД: все, что я отправил

2) Поскольку я заканчиваю диалог в ComponentDialog2, элемент управления (код) должен вернуться обратно к ComponentDialog1 и перейти к третьему шагу водопада ComponentDialog1.

Пример адаптивной карты

  {
   "type": "AdaptiveCard",
   "body": [
    {
        "type": "TextBlock",
        "size": "Medium",
        "weight": "Bolder",
        "text": "Let us know your feedback"
    }
],
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"version": "1.0",
"actions": [
    {
        "type": "Action.Submit",
        "title": "Good",
        "data": "good"
    },

     {
        "type": "Action.Submit",
        "title": "Average",
        "data": "avaerage"
    }
    ,{
        "type": "Action.Submit",
        "title": "Bad",
        "data": "bad"
    }
]
}

Пожалуйста, помогите мне, как достичь

1 Ответ

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

После значительного тестирования я вполне уверен, что вы пропустили этот вызов где-то (он должен каким-то образом быть вызванным в OnMessageAsync():

var results = await dialogContext.ContinueDialogAsync(cancellationToken);

Способ, которым Core Bot Sample делает это, заключается в добавлении его к DialogExtensions, который вызывается в OnMessageAsync()


Обновление: я также заметил, что это может произойти, если await ConversationState.SaveChangesAsync(turnContext, true, cancellationToken); находится в OnTurnAsync(), но включен в OnDialogAsync() (или если он не находится ни в одном месте); Вы также хотите убедиться, что он установлен на false, а не true, как правило.

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