建议的操作等待用户首先选择

时间:2019-02-19 07:15:19

标签: c# botframework

我在文档中关注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.

3 个答案:

答案 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)。它们的用途广泛,可在您提示用户进行输入时使用,但也允许用户键入您提出的建议操作之外的任何内容。例如,您可能会问用户自己喜欢的颜色并建议RedGreenBlue,但允许用户键入他们想要的任何颜色。 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

enter image description here

使用选择提示限制用户选择

我已将您的代码改编为使用“选择提示”,它将等待用户输入。 请注意,选择提示不允许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

enter image description here

答案 2 :(得分:0)

在bot框架v3上,您应该添加Context.Wait()以使bot在继续之前等待用户输入。您还需要检查您的uggestedAction代码之后是否有成功的“发布”或“发送”活动。

以及何时使用建议的操作以及何时使用选择提示?

  • 如果您是机器人,请使用建议的操作,您的建议可能包含也可能不包含输入。
  • 如果您的漫游器期望输入,并且应该包含在您提供的选择中,请使用Choice提示。常见用法是“是”或“否”