BotFramework在表单流

时间:2017-02-19 17:22:40

标签: c# botframework

我想从formFlow表单中访问userData。我能够做到的唯一方法是在我的FormFlow类public static IDialogContext context { get; set; }上创建一个静态上下文对象,如下所示。

    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;

有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

我认为更好的方法是使用FormDialog而不是new方法来实例化FromForm。这样,您就可以发送预填充状态中已有的任何值的表单状态实例(在您的情况下为Reservation)(例如userName

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

context.Call(form, this.ReservationFormComplete)

Here就是这样做的一个例子。

答案 1 :(得分:1)

感谢Ezequiel Jadib,我想我会在这里为其他人发布整个解决方案。

所以在RootDialog中我使用new实例化对话框并将上下文传递给预留模型。

User.update({ "_id": req.params.id  },
    { $addToSet: { "completed": req.body.completed } }, function (err, d) {
        if (!d.nModified) {
           // same value entered won't add to the array
        } else {
            // new value entered and will add to the array
        }
});

在我的预订类(我的模型)中,我添加了一个构造函数,它接受了一个IDialogContext对象(并在顶部添加了一个var form = new FormDialog<Reservation>( new Reservation(context), ReservationForm.BuildForm, FormOptions.PromptInStart, null); )创建一个属性来保存它与私有的setter。

using Microsfot.Bot.Build.Dialogs;

然后我可以从表单流中访问我的整个上下文(userData,ConversationData等),以便检查它并忽略可能会重复的问题。

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