MSボットフレームワークを使用して構築されたボットに、次のように開始するサブダイアログがあります-標準的な方法:
public async Task StartAsync(IDialogContext context)
{
var msg = "Let's find your flights! Tell me the flight number, city or airline.";
var reply = context.MakeMessage();
reply.Text = msg;
//add quick replies here
await context.PostAsync(reply);
context.Wait(UserInputReceived);
}
このダイアログは、前の画面でユーザーが「フライト」というボタンをタップしたか、フライト番号をすぐに入力したかに応じて、2 つの異なる方法で呼び出されます。親ダイアログのコードは次のとおりです。
else if (response.Text == MainOptions[2]) //user tapped a button
{
context.Call(new FlightsDialog(), ChildDialogComplete);
}
else //user entered some text instead of tapping a button
{
await context.Forward(new FlightsDialog(), ChildDialogComplete,
activity, CancellationToken.None);
}
質問:FlightsDialog
そのダイアログが または を使用して呼び出されたかどうかを ( 内から) どうすれば知ることができますcontext.Call()
かcontext.Forward()
? これは、 の場合context.Forward()
、StartAsync()
ユーザーにフライト番号の入力を求めるプロンプトを出力してはならないためです。ユーザーは既にこれを行っています。
私が持っている最良のアイデアは、ConversationData
以下のようにまたはユーザーデータにフラグを保存し、IDialog からアクセスすることですが、もっと良い方法があると思いましたか?
public static void SetUserDataProperty(Activity activity, string PropertyName, string ValueToSet)
{
StateClient client = activity.GetStateClient();
BotData userData = client.BotState.GetUserData(activity.ChannelId, activity.From.Id);
userData.SetProperty<string>(PropertyName, ValueToSet);
client.BotState.SetUserDataAsync(activity.ChannelId, activity.From.Id, userData);
}