3

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

1 に答える 1

4

残念ながらForward、実際には呼び出しますCall(その後、他の処理を実行します)。そのため、Dialog は区別できません。

void IDialogStack.Call<R>(IDialog<R> child, ResumeAfter<R> resume)
{
    var callRest = ToRest(child.StartAsync);
    if (resume != null)
    {
        var doneRest = ToRest(resume);
        this.wait = this.fiber.Call<DialogTask, object, R>(callRest, null, doneRest);
    }
    else
    {
        this.wait = this.fiber.Call<DialogTask, object>(callRest, null);
    }
}

async Task IDialogStack.Forward<R, T>(IDialog<R> child, ResumeAfter<R> resume, T item, CancellationToken token)
{
    IDialogStack stack = this;
    stack.Call(child, resume);
    await stack.PollAsync(token);
    IPostToBot postToBot = this;
    await postToBot.PostAsync(item, token);
}

https://github.com/Microsoft/BotBuilder/blob/10893730134135dd4af4250277de8e1b980f81c9/CSharp/Library/Dialogs/DialogTask.cs#L196から

于 2016-11-02T16:39:00.733 に答える