我想从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;
有更好的方法吗?
答案 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;
}