После вызова context.Forward, как получить элемент в дочернем диалоге - PullRequest
0 голосов
/ 11 мая 2018

У меня есть одно главное диалоговое окно Luis, мне нужно переслать CheckListDialog и передать «luisresult.entity» в CheckListDialog, код, подобный приведенному ниже:

context.Forward(new CheckListDialog(), this.DialogResumeAfter,result.Entities,CancellationToken.None);

Вопрос: в «CheckListDialog»", как я могу получить" result.Entities "?

PS: есть другое решение для получения Luisresult.Entities,

context.Call(new CheckListDialog(result.Entities), this.DialogResumeAfter);

Это решениеработает, но я хотел бы знать, как получить значение параметра, используя context.Forward.

1 Ответ

0 голосов
/ 11 мая 2018

При использовании метода context.Forward ожидается, что вы отправите параметр типа IMessageActivity. Если вы просто хотите отправить свою первую сущность, вы можете создать переменную IMessageActivity, а затем перенаправить ее в намеченный вами метод.

["YourLuisIntent"]
public async Task YourLuisIntent(IDialogContext context, IAwaitable<IMessageActivity> argument, LuisResult result)
{
        var message = await argument;
        message .Text = result.Entities[0].Entity;
        var dialog = new CheckListDialog();
        await context.Forward(dialog, this.DialogResumeAfter, message , CancellationToken.None);

}

Это обычный метод достижения цели. Но если вы настаиваете на передаче LuisResult методу, то Bot Framework позволяет вам сделать следующее:

Луис Диалог

["YourLuisIntent"]
public async Task YourLuisIntent(IDialogContext context, LuisResult result)
{
        var dialog = new CheckListDialog();
        await context.Forward(dailog, this.DialogResumeAfter, result.Entities, CancellationToken.None);

}

Диалог проверки списка

Здесь вы ожидаете значение типа IList, а не IMessageActivity. Вы должны помнить об этом и использовать этот диалог только для доступа к сущностям Луиса.

public Task StartAsync(IDialogContext context)
{
         context.Wait<IList<EntityRecommendation>>(MessageReceivedAsync);
         return Task.CompletedTask;
}

private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IList<EntityRecommendation>> result)
{
        var LuisResult = await result as IList<EntityRecommendation>;

        foreach( var entity in LuisResult)
        {
            await context.PostAsync($"{entity.Entity} - {entity.Type}");
        }

}
...