对话链问题(传递消息)

时间:2016-10-10 20:53:51

标签: c# botframework

我有这段代码。

public class HotelBotDialog
{

    public static readonly IDialog<string> dialog = Chain.PostToChain()
        .Select(msg => msg.Text)
        .Switch(
             new RegexCase<IDialog<string>>(new Regex("^hi", RegexOptions.IgnoreCase), (context, txt) =>
             {
                 return Chain.ContinueWith(new GreetingDialog(), AfterGreetingContinuation);
             }),
             new DefaultCase<string, IDialog<string>>((context, txt) =>
             {
                 return Chain.ContinueWith(FormDialog.FromForm(RoomReservation.BuildForm), AfterGreetingContinuation);                   
             }))
 .Unwrap()
 .PostToUser();

    private async static Task<IDialog<string>> AfterGreetingContinuation(IBotContext context, IAwaitable<object> res)
    {
        var token = await res;
        var name = "User";
        context.UserData.TryGetValue<string>("Name", out name);
        return Chain.Return($"Thank you for using the hotel bot: {name}");
    }
}

}

哪个会有效,除了问题是每当我陷入&#34;默认情况&#34;我需要输入第二个条目才能开始我的表格。所以这是对话框的样子

我:测试 BOT: 我:测试2 Bot:欢迎来到酒店机器人......等等等等

我想要的是

我:测试 Bot:欢迎来到酒店机器人......

我认为在我没有通过原始邮件或其他内容时出现了问题。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

FormDialog.FromForm方法有一个接收FormOptions的重载。该枚举的价值之一是PrompInStart,它基本上可以做你想要的;马上开始表格。

如果您没有为FormOptions提供任何值,则默认为None,然后FormDialog只是坐在那里等待新消息。

这是BotBuilder中的逻辑(也是linked):

if (this._options.HasFlag(FormOptions.PromptInStart))
{
    await MessageReceived(context, null);
}
else
{
    context.Wait(MessageReceived);
}

因此,要解决您的问题,请将表单实例化的方式更改为:

FormDialog.FromForm(RoomReservation.BuildForm, FormOptions.PromptInStart)

请注意最后的 FormOptions.PromptInStart