C# 如何在Luisint中调用PromptDialog?

C# 如何在Luisint中调用PromptDialog?,c#,botframework,azure-language-understanding,C#,Botframework,Azure Language Understanding,我有一本路易斯对话录,里面有几个路易斯的意图。在这些意图中,我可能需要向用户询问更多信息。在这些情况下,我尝试使用PromptDialog或PromptString 我已经试过了: [LuisIntent("MyIntent")] public async Task MyIntent(IDialogContext context, LuisResult result) { if (result.Entities.Count == 0) { PromptDialo

我有一本路易斯对话录,里面有几个路易斯的意图。在这些意图中,我可能需要向用户询问更多信息。在这些情况下,我尝试使用PromptDialog或PromptString

我已经试过了:

[LuisIntent("MyIntent")]
public async Task MyIntent(IDialogContext context, LuisResult result)
{
    if (result.Entities.Count == 0)
    {

        PromptDialog.Text(context, AfterUserInputSymbol, "Message to the user", "Try again message", 2);
        result.Entities[0].Entity = userSymbol;                
    }

    //some other code

    context.Wait(MessageReceived);
}

private async Task AfterUserInputSymbol(IDialogContext context, IAwaitable<string> result)
{
    userSymbol = await result;
    context.Wait(MessageReceived);
}
[LuisIntent(“我的意图”)]
公共异步任务MyIntent(IDialogContext上下文,LuisResult结果)
{
if(result.Entities.Count==0)
{
文本(上下文,AfterUserInputSymbol,“给用户的消息”,“重试消息”,2);
result.Entities[0]。Entity=userSymbol;
}
//其他代码
Wait(MessageReceived);
}
UserInputSymbol之后的专用异步任务(IDialogContext上下文,IAwaitable结果)
{
userSymbol=等待结果;
Wait(MessageReceived);
}
这是:

[LuisIntent("MyIntent")]
public async Task MyIntent(IDialogContext context, LuisResult result)
{
    if (result.Entities.Count == 0)
    {
        PromptString dialog = new PromptString("Message to the user", "Try again message", 2);
        context.Call(dialog, AfterUserInputSymbol);
        result.Entities[0].Entity = userSymbol;                
    }

    //some other code

    context.Wait(MessageReceived);
}

private async Task AfterUserInputSymbol(IDialogContext context, IAwaitable<string> result)
{
    userSymbol = await result;
    context.Wait(MessageReceived);
}
[LuisIntent(“我的意图”)]
公共异步任务MyIntent(IDialogContext上下文,LuisResult结果)
{
if(result.Entities.Count==0)
{
PromptString对话框=新建PromptString(“发送给用户的消息”,“重试消息”,2);
调用(对话框,AfterUserInputSymbol);
result.Entities[0]。Entity=userSymbol;
}
//其他代码
Wait(MessageReceived);
}
UserInputSymbol之后的专用异步任务(IDialogContext上下文,IAwaitable结果)
{
userSymbol=等待结果;
Wait(MessageReceived);
}
在这两种情况下,用户都不会看到提示,
userSymbol
的值为空。当我调试时,代码仅在进入此部分时输入
AfterUserInputSymbol
result.Entities[0]。Entity=userSymbol


如何在LUISINT中提示输入更多信息?

由于您的问题中没有任何错误,因此不确定具体发生了什么,但是可能发生的情况是,您正在启动一个新对话框,并且您有上下文。在那里等待(MessageReceived)。如果您正在启动一个对话框,您不必等待该流中的消息,这就是为什么我要在那里添加一个else子句

 if (result.Entities.Count == 0)
    {
        PromptDialog.Text(context, AfterUserInputSymbol, "Message to the user", "Try again message", 2);
        // The following line shouldn't be here
        result.Entities[0].Entity = userSymbol;                
    }
    //here you should put an else
   else 
   {
    context.Wait(MessageReceived);
   }
另外,请记住,在调用对话框后,您将无法将userSymbol分配给Luis结果实体,因为您正在尝试这样做。这必须在ResumeAfter方法“AfterUserInputSymbol”中完成


一旦你这样做了,你就可以手动调用你的意图来传递上下文和更新的Luis结果(你可能需要保存上一个结果,这取决于你试图实现什么)

我花了一段时间做了一些测试和其他事情,但效果很好。非常感谢。