Обработка значения действия отправки адаптивной карты во вложенных диалогах

У меня есть чат-бот, созданный на C # с использованием SDK .net Core 2.2 Шаблон виртуального помощника, который имеет 1 главный диалог и несколько диалогов (диалоговые окна компонентов). Каждый диалог компонента вызывает другой диалог компонента. Скажем, у меня есть MainDialog, двухкомпонентный диалог с именем 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"
    }
]
}

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


person PavanKumar GVVS    schedule 11.07.2019    source источник
comment
Не возражаете также загрузить код для своей адаптивной карты?   -  person Matt Stannett    schedule 11.07.2019
comment
добавлена ​​адаптивная карта   -  person PavanKumar GVVS    schedule 12.07.2019
comment
Я могу заставить вашу адаптивную карту перейти на следующий шаг, используя большую часть вашего кода. Можете ли вы опубликовать любой код, который вы используете для OnTurnAsync() или OnMessageAsync(). Или еще лучше, можете ли вы дать ссылку на свое репо?   -  person mdrichardson    schedule 12.07.2019


Ответы (1)


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

var results = await dialogContext.ContinueDialogAsync(cancellationToken);

Как Core Bot Sample делает это, добавляя его к DialogExtensions, который вызывается в _ 4_


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

person mdrichardson    schedule 12.07.2019