2017-10-13 46 views
0

我一直在尝试使用几个教程学习机器人的工作方式。如何以相同的方法从FormFLow访问保存的数据

This blog post在解释formflows时非常方便,但是当涉及到保存数据时,我对我正在尝试执行的项目有个疑问。

他处理它保存在.OnCompletion数据如下所示的方式:

public static IForm<ProfileForm> BuildForm() 
{ 
    return new FormBuilder<ProfileForm>() 
      .Message("Welcome to the profile bot!") 
      .OnCompletion(async (context, profileForm) => 
      { 
       // Set BotUserData 
       context.PrivateConversationData.SetValue<bool>(
        "ProfileComplete", true); 
       context.PrivateConversationData.SetValue<string>(
        "FirstName", profileForm.FirstName); 
       context.PrivateConversationData.SetValue<string>(
        "LastName", profileForm.LastName); 
       context.PrivateConversationData.SetValue<string>(
        "Gender", profileForm.Gender.ToString()); 
       // Tell the user that the form is complete 
       await context.PostAsync("Your profile is complete."); 
      }) 
      .Build(); 
} 

但是他的方式访问设定的变量是在消息控制器使用:

// Get any saved values 
     StateClient sc = activity.GetStateClient(); 
     BotData userData = sc.BotState.GetPrivateConversationData(
      activity.ChannelId, activity.Conversation.Id, activity.From.Id); 
     var boolProfileComplete = userData.GetProperty<bool>("ProfileComplete"); 
     if (!boolProfileComplete) 
     { 
      // Call our FormFlow by calling MakeRootDialog 
      await Conversation.SendAsync(activity, MakeRootDialog); 
     } 
     else 
     { 
      // Get the saved profile values 
      var FirstName = userData.GetProperty<string>("FirstName"); 
      var LastName = userData.GetProperty<string>("LastName"); 
      var Gender = userData.GetProperty<string>("Gender"); 

无论如何,要在同一个课堂上做这个和formflow一样吗?我试图用它作为比较指导正在进行的对话:

public IForm<DVLADialog> BuildForm() 
    { 

     OnCompletionAsyncDelegate<DVLADialog> completeForm = async(context, state) => 
     { 

      try 
      {      
       if (dvla.AbiGroupOneToFifty <= 30 && Value <= 50000) 
       { 
        await context.PostAsync($"Success!."); 
       } 
       else 
       { 
        await context.PostAsync("Uh Oh"); 
       } 
      } 
      catch (Exception ex) 
      { 
       throw; 
      } 

     }; 

     return new FormBuilder<DVLADialog>() 
      .Field(nameof(Value)) 
      .Field(nameof(DateOfPurchase)) 
      .Field(nameof(Modifications)) 
      .Field(nameof(Stored)) 
      .Field(nameof(Postcode)) 
      .Confirm("Is this all correct? {*}") 
      .OnCompletion(async (context, save) => 
      { 
       // Set BotUserData 
       context.PrivateConversationData.SetValue<bool>(
        "ProfileComplete", true); 
       context.PrivateConversationData.SetValue<float>(
        "Value", save.Value); 
       context.PrivateConversationData.SetValue<DateTime>(
        "Date Of Purchase", save.DateOfPurchase); 
       context.PrivateConversationData.SetValue<string>(
        "Mods", save.Modifications.ToString()); 
       context.PrivateConversationData.SetValue<string>(
        "Stored", save.Stored.ToString()); 
       context.PrivateConversationData.SetValue<string>(
        "Postcode", save.Postcode.ToString()); 

       // Tell the user that the form is complete 
       await context.PostAsync("Your profile is complete."); 
      }) 
      .OnCompletion(completeForm) 
      .Build(); 
    } 

感谢您提供任何帮助。

+0

为什么不简单地在'.OnCompletion(async(context,save)=> ...'中添加你的测试呢? –

回答

0

找到了正确的方法。我在网上阅读的很多信息都表示FormFlows不会保存用户输入。它保存在状态中。例如state.Value。所以代码:

public IForm<DVLADialog> BuildForm() 
    { 

     OnCompletionAsyncDelegate<DVLADialog> completeForm = async(context, state) => 
     { 

      try 
      {     

       if (dvla.AbiGroupOneToFifty <= 30 && state.Value <= 50000) 
       { 
        await context.PostAsync($"Yay"); 
       } 
       else 
       { 
        await context.PostAsync("Uh Oh"); 
       } 
      } 
      catch (Exception ex) 
      { 
       throw; 
      } 

     }; 

     return new FormBuilder<DVLADialog>() 
      .Field(nameof(Value)) 
      .Field(nameof(DateOfPurchase)) 
      .Field(nameof(Modifications)) 
      .Field(nameof(Stored)) 
      .Field(nameof(Postcode)) 
      .Confirm("Is this all correct? {*}") 

      .OnCompletion(completeForm) 
      .Build(); 
    } 
} 

问题比我想象的要容易得多。希望这有助于未来的人。

相关问题