2017-06-17 71 views
0

使用PromptDialog我有以下LUIS意图的实现 -如何提示用户没有在微软机器人框架

[LuisIntent("MyIntent")] 
    public async Task MyIntent(IDialogContext context, IAwaitable<IMessageActivity> res, LuisResult result) 
    { 
     var message = await res; 
     try 
     { 
      await context.PostAsync("I see that you have below options <br/> 1. Do first task <br/> 2. Do second task <br/> 3. Do third task "); 
      PromptDialog.Text(context, taskdoer, "You can ask me like - <br/>Do task 2<br/>or simply enter 2"); 
     } 
     catch (Exception e) 
     { 
      await context.PostAsync("Error is <br/> " + e.ToString()); 
      context.Wait(MessageReceived); 
     } 
    } 

而对于taskdoer的定义 -

private async Task taskdoer(IDialogContext context, IAwaitable<string> result) 
    { 
     string strTaskNumber = await result; 
       if (strTaskNumber == "2") 
       { 
        await context.PostAsync("So, you have entered " + strTaskNumber); 
        await context.PostAsync("This is Task 2"); 
        context.Wait(MessageReceived); 
       } 
       if (strTaskNumber == "3") 
       { 
        await context.PostAsync("So, you have entered " + strTaskNumber); 
        await context.PostAsync("This is Task 3"); 
        context.Wait(MessageReceived); 
       } 
    } 

我想什么来实现的是,没有使用新的方法 - taskdoer,我怎么能在MyIntent方法本身中实现taskdoer逻辑,但是用户提示输入如taskdoer? 是否有任何方式可以提示用户不使用Microsoft bot中的PromptDialog?

回答

3

您无法按照您所看到的方式实施它。如果您需要来自用户的输入,您将始终必须以新方法采取行动。

尽管您仍然有一个方法并且在相同范围内使用一些技巧,但您可以尝试使用匿名方法。它可能不起作用!

PromptDialog.Text(context, async (IDialogContext ctx, IAwaitable<string> resume) => 
{ 
    // your magic here 
}, "text"); 

,如果你不希望使用Prompt的意图方法中的另一种方法是:

  1. 而不是使用Prompt,做一个context.PostAsync显示的问题给用户
  2. 使用context.Wait等待用户输入。你可以等待一个新的方法(应该有2个参数,IDialogContextIAwaitable<IMessageActivity>),或者你可以使用LUIS的MessageReceived覆盖它并在那里添加一些逻辑知道消息何时不应该去LUIS,你应该执行taskdoer逻辑。我建议你有一个单独的方法。

我很好奇你为什么不想使用Prompt