У меня есть чат-бот, созданный на 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"
}
]
}
Пожалуйста, помогите мне, как достичь
OnTurnAsync()
илиOnMessageAsync()
. Или еще лучше, можете ли вы дать ссылку на свое репо? - person mdrichardson   schedule 12.07.2019