我有这段代码。
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:欢迎来到酒店机器人......
我认为在我没有通过原始邮件或其他内容时出现了问题。
有人可以帮忙吗?
答案 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 。