2016-10-10 5 views
0

私はこのコードを持っています。問題は、私は、「デフォルトの場合」に落ちた時はいつでも、私は自分のフォームをキックオフするために、第2のエントリに入力する必要があるということです除き、動作しますダイアログチェーンの問題(メッセージの受け渡し)

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}"); 
    } 
} 

}

。だからここダイアログが

のように私に見えるものです:テスト ボット: ミー:Test2を ボット:私が欲しいのホテルのボットへようこそ...何とか何とか

私がある:テスト Bot:ホテルボットにようこそ。

元のメッセージや何かを渡していない場所が間違っていると思います。

誰かが助けることができますか?

答えて

1

FormDialog.FromFormメソッドには、FormOptionsを受け取るオーバーロードがあります。その列挙型の値の1つは、基本的にあなたが望むことをするPrompInStartです。すぐにフォームを開始してください。

FormOptionsに値を指定しない場合、既定では[なし]に設定され、FormDialogは新しいメッセージを待つだけです。

これは(もlinked)を行いBotBuilder内のロジック:

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

お知らせ:

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

だから、あなたの問題を解決するために、あなたがフォームをインスタンス化する方法を変更FormOptions.PromptInStart最後に

+0

ありがとうございました!それはトリックでした! – Matt

関連する問題