2017-10-13 11 views
0

나는 여러 가지 자습서를 사용하여 봇의 작동 방식을 배우려고 노력했습니다.동일한 방법으로 FormFLow에서 저장된 데이터에 액세스하는 방법

This blog post은 formflows를 설명 할 때 매우 편리하지만 데이터 저장과 관련하여 제가 수행하려고하는 프로젝트에 대한 질문이 있습니다.

그 아래와 같이 그것이 .OnCompletion의 데이터를 저장한다 취급하는 방법 :

// 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"); 

:

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

그러나 방식이 그 설정 변수 액세스를 사용하여 메시지 제어기에 어쨌든 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

올바른 방법을 찾았습니다. 온라인으로 읽은 많은 정보는 FormFlow가 사용자 입력을 저장하지 않는다고 말했습니다. 그것은 상태로 저장됩니다. 예 : 값. 값. 코드 :

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

문제는 생각보다 훨씬 쉽게 해결할 수있었습니다. 희망이 사람을 미래에 도움이됩니다.