我在文档中关注this。我正在使用Botframework v4。
但是,它并没有等到用户先选择下一步。 您如何实施呢?您是否将其放在提示中?如何在下一个提示中获取所选建议操作的值?
以及何时使用建议的操作以及何时使用选择提示?
AddStep(async (stepContext, cancellationToken) =>
{
var reply = stepContext.Context.Activity.CreateReply("What can i do for you?");
reply.SuggestedActions = new SuggestedActions()
{
Actions = new List<CardAction>()
{
new CardAction() { Title = "Learn more!", Type = ActionTypes.ImBack, Value = "Learn more!" },
new CardAction() { Title = "Opportunities!", Type = ActionTypes.ImBack, Value = "Opportunities!" },
new CardAction() { Title = "Define my goals!", Type = ActionTypes.ImBack, Value = "Define my goals!" },
new CardAction() { Title = "Finko.ph", Type = ActionTypes.OpenUrl, Value = "https://m-moreno.wixsite.com/finkoph?fbclid=IwAR1NVtlyKfzZ0mYFIWva8L-d8TUv4KFpt_m1i1ij3raT-pbWr2c3-kqzB2Q" },
},
};
await stepContext.Context.SendActivityAsync(reply, cancellationToken);
});
//how to wait for user choice before moving to the next step.
答案 0 :(得分:1)
您将希望使用Dialog API的提示功能,而不是自己构建Activity
并使用SendActivityAsync
发送它。在这种情况下,您想使用ChoicePrompt
,这将有助于确保在允许进行对话之前确保选择了其中一个选项。
首先,在您的DialogSet
中添加一个选择提示:
// Add the prompt with the suggested action list style
myDialogSet.Add(new ChoicePrompt("myChoicePrompt") { Style = ListStyle.None });
现在,ListStyle.None
在这里对于您的情况很重要,因为您在设计中有一个额外的要求,即除了选择以外,您还提出了可以打开的链接。通过使用None
,您将告诉ChoicePrompt
您将自己构建Activity
,并且它不应该为您执行任何工作。
下一步,更新瀑布步骤以利用此提示:
AddStep(async (stepContext, cancellationToken) =>
{
return await stepContext.PromptAsync(
"myChoicePrompt",
new PromptOptions
{
Prompt = BuildCardChoicePromptActivity(),
Choices = new List<Choice>
{
new Choice("Learn more!"),
new Choice("Opportunities!"),
new Choice("Define my goals!"),
}
},
cancellationToken: cancellationToken);
});
// Factored this out into its own method for clarity (NOTE: you don't need to use CreateReply)
private Activity BuildCardChoicePromptActivity()
{
return new Activity
{
Type = ActivityTypes.Message,
Text = "What can I do for you?",
SuggestedActions = new SuggestedActions()
{
Actions = new List<CardAction>()
{
new CardAction() { Title = "Learn more!", Type = ActionTypes.ImBack, Value = "Learn more!" },
new CardAction() { Title = "Opportunities!", Type = ActionTypes.ImBack, Value = "Opportunities!" },
new CardAction() { Title = "Define my goals!", Type = ActionTypes.ImBack, Value = "Define my goals!" },
new CardAction() { Title = "Finko.ph", Type = ActionTypes.OpenUrl, Value = "https://m-moreno.wixsite.com/finkoph?fbclid=IwAR1NVtlyKfzZ0mYFIWva8L-d8TUv4KFpt_m1i1ij3raT-pbWr2c3-kqzB2Q" },
},
},
};
}
最后,由于要在实际选择中包括OpenUrl
操作,因此您的场景要先进一些,但是关键要点是使用ChoicePrompt
来显示操作并阻止对话,直到发回特定的Choices
之一。
答案 1 :(得分:1)
设计上建议的操作会在发送其他任何消息后立即消失(see opening paragraph)。它们的用途广泛,可在您提示用户进行输入时使用,但也允许用户键入您提出的建议操作之外的任何内容。例如,您可能会问用户自己喜欢的颜色并建议Red
,Green
,Blue
,但允许用户键入他们想要的任何颜色。 This bot sample做类似的事情。建议的操作,如果在消息中发送,不会等待用户输入。但是,如果您在文本提示中使用它们,它们将会。详情请见下文。
选择提示会限制用户单击您向其显示的按钮,或者键入按钮(或Synonyms
)上的确切内容。如果他们输入其他任何内容,则会再次提示他们输入选项之一。选择提示是提示,因此会自动等待用户输入。
简而言之:
我已经修改了您的代码,以便您可以在文本提示中发送建议的操作。在继续下一个瀑布步骤之前,这将等待用户输入。但是,用户输入的任何文本将被视为有效。如果您只想限制用户选择几个选项,请使用选择提示(在下面进一步介绍)
建议的操作文本提示:
var opts = new PromptOptions
{
Prompt = new Activity
{
Type = ActivityTypes.Message,
Text = "What can i do for you?",
SuggestedActions = new SuggestedActions()
{
Actions = new List<CardAction>()
{
new CardAction() { Title = "Learn more!", Type = ActionTypes.ImBack, Value = "Learn more!" },
new CardAction() { Title = "Opportunities!", Type = ActionTypes.ImBack, Value = "Opportunities!" },
new CardAction() { Title = "Define my goals!", Type = ActionTypes.ImBack, Value = "Define my goals!" },
new CardAction() { Title = "Finko.ph", Type = ActionTypes.OpenUrl, Value = "https://m-moreno.wixsite.com/finkoph?fbclid=IwAR1NVtlyKfzZ0mYFIWva8L-d8TUv4KFpt_m1i1ij3raT-pbWr2c3-kqzB2Q" },
},
},
}
};
// Display a Text Prompt with suggested actions and wait for input
return await stepContext.PromptAsync("textPrompt", opts);
由于在文本提示中使用了建议的操作,因此该值显示在stepContext.Result
我已将您的代码改编为使用“选择提示”,它将等待用户输入。 请注意,选择提示不允许OpenUrl
;当用户使用OpenUrl
操作单击一个选项时,即使您使用DisplayText
,它也会清除选择并且不继续。相反,在下一个瀑布步骤中,您可以显示用户单击“ Finko.ph”选项(使用opts.Choices.Add(new Choice() { Value = "Finko.ph" });
添加后)的URL。
// In constructor
AddDialog(new ChoicePrompt("choicePrompt"));
...
// In waterfall step
var opts = new PromptOptions()
{
Prompt = MessageFactory.Text("What can i do for you?"),
RetryPrompt = MessageFactory.Text("Sorry, please choose an option from the list."),
Choices = new List<Choice>(),
};
opts.Choices.Add(new Choice() { Value = "Learn more!" });
opts.Choices.Add(new Choice() { Value = "Opportunities!" });
opts.Choices.Add(new Choice() { Value = "Define my goals!" });
// Display a Choice Prompt and wait for input
return await stepContext.PromptAsync("choicePrompt", opts);
选择提示的值显示在stepContext.Result.Value
答案 2 :(得分:0)
在bot框架v3上,您应该添加Context.Wait()以使bot在继续之前等待用户输入。您还需要检查您的uggestedAction代码之后是否有成功的“发布”或“发送”活动。
以及何时使用建议的操作以及何时使用选择提示?