我有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的情况下提示用户?
答案 0 :(得分:3)
您无法以您正在查看的方式实现它。如果您需要来自用户的输入,您将始终必须以新方法对响应进行操作。
你可以尝试使用匿名方法,虽然你仍然有一个方法并做一些技巧让它在同一范围内。它可能不起作用!
PromptDialog.Text(context, async (IDialogContext ctx, IAwaitable<string> resume) =>
{
// your magic here
}, "text");
如果您不想在intent方法中使用Prompt
,另一种选择是:
Prompt
,而是context.PostAsync
向用户显示问题context.Wait
等待用户输入。您可以等待一个新方法(应该有2个参数IDialogContext
和IAwaitable<IMessageActivity>
),或者您可以使用LUIS
中的MessageReceived,覆盖它并在那里添加一些逻辑以了解何时消息不应该LUIS
,您应该执行taskdoer
逻辑。我建议你有一个单独的方法。我很好奇为什么你不想使用Prompt
。