2017-02-19 11 views
1

formFlowフォームからuserDataにアクセスしたいとします。私がそれを行うことができる唯一の方法は、以下に示すように、私のFormFlowクラスpublic static IDialogContext context { get; set; }上に静的コンテキストオブジェクトを作成することです。BotFrameworkフォームフロー内でuserDataにアクセスする

public static IDialogContext context { get; set; } 

    public static IForm<Reservation> BuildForm() 
    { 
     string userName = String.Empty; 
     context.UserData.TryGetValue<string>("Name", out userName); 
     return new FormBuilder<Reservation>() 
      .Field(new FieldReflector<Reservation>(nameof(Reservation.Name)) 
       .SetActive((state) => 
       { 
        //StateClient stateClient = activity.GetStateClient(); 
        //BotData userData = stateClient.BotState.GetUserDataAsync(activity.ChannelId, activity.From.Id); 
        state.Name = userName; 
        return String.IsNullOrEmpty(state.Name); 

次に、フォームを呼び出す前に私のRootDialogで設定しました。

case ReservationOption: 
        ReservationForm.context = context; 
        context.Call(FormDialog.FromForm<Reservation>(ReservationForm.BuildForm, 
        FormOptions.PromptInStart), this.ReservationFormComplete); 

        break; 

これを行うより良い方法はありますか?

+0

パーフェクト、私はこの同じ問題を考えていました! –

答えて

2

FromFormメソッドの代わりにnewを使用してFormDialogをインスタンス化するのが良い方法だと思います。そうすれば、あなたが(例えばuserName

var form = new FormDialog<Reservation>(
       new Reservation(userName), 
       ReservationForm.BuildForm, 
       FormOptions.PromptInStart, 
       null); 

context.Call(form, this.ReservationFormComplete) 

Hereはちょうどそれをやったサンプルである状態で、あなたが既に持っている任意の値が事前に満たされた(あなたのケースReservationで)フォーム状態のインスタンスを送信することができます。

+1

ありがとうございました..私は予約クラスにコンストラクタを追加してコンテキストを渡すことを見落としました。 –

+0

コンテキストの設定は間違いなく機能しますが、プロパティの値を送信する利点は、「状態」プロパティの値が –

+0

Gotchaに設定されている場合、FormFlowがそれらをスキップするという意味で優れています。したがってthis.Name =コンストラクタ内の名前とそれで終わる。 –

1

Ezequiel Jadibのおかげで、私は他の人たちのためにソリューション全体を投稿すると思った。

RootDialogでは、newを使用してダイアログをインスタンス化し、コンテキストを予約モデルに渡します。私の予約クラスで

var form = new FormDialog<Reservation>(
new Reservation(context), 
ReservationForm.BuildForm, 
FormOptions.PromptInStart, 
null); 

(マイモデル)私はIDialogContextオブジェクトにかかったコンストラクタを追加しました(トップへusing Microsfot.Bot.Build.Dialogs;を追加する)プライベートセッターとそれを保持するためのプロパティを作成します。

public class Reservation 
{ 
    public IDialogContext Context { get; private set; } 
    public Reservation(IDialogContext context) 
    { 
     this.Context = context; 
    } 

私はそれをチェックし、繰り返しになる質問を無視するためにformflowの内側から私の全体の文脈(のuserData、ConversationData、など...)にアクセスすることができています。

state.Context.UserData.TryGetValue<string>("Name", out userName); 
state.Name = userName; 
関連する問題