2017-10-31 6 views
2

저는 봇 프레임 워크를 사용하여 놀고 있었고 가족/애완 동물의 구성원을 자세하게 설명하는 재미있는 채팅 봇을 만들었습니다.FormFlow : 반복적 인 질문을 사용하여 여러 항목 추가

사용자가 만족할 때까지 동일한 일련의 질문을 되풀이하는 방법이 있습니까? 아래 예제 코드 :

[Prompt("What is your family name?")] 
    public string familyName{ get; set; } 

    [Prompt("What is your postcode?")] 
    public string postcode { get; set; } 

    [Prompt("Would you like to add a family member? {||}")] 
    public bool AddPerson { get; set; } 

    [Prompt("What is their name?")] 
    public string PersonName { get; set; } 

    [Prompt("How old are they?")] 
    public string PersonAge{ get; set; } 

    [Prompt("How are they related to you?")] 
    public string PersonRelation{ get; set; } 

    [Prompt("Would you like to add another family member? {||}")] 
    public bool addAnotherPerson { get; set; } 

public IForm<Family> BuildForm() 
    { 
     return new FormBuilder<GetQuoteDialog>() 
      .Field(nameof(familyName)) 
      .Field(nameof(postcode)) 

      //Choose to add a person to the family 
      .Field(nameof(AddPerson)) 

      //Details of that person. 
      .Field(new FieldReflector<Family>(nameof(PersonName)) 
      .SetActive((state) => state.AddPerson== true)) 
      .Field(new FieldReflector<Family>(nameof({PersonAge)) 
      .SetActive((state) => state.AddPerson== true)) 
      .Field(new FieldReflector<Family>(nameof({PersonRelation)) 
      .SetActive((state) => state.AddPerson== true)) 

      //Prompts the user to add another if they wish 
      //Recurs to the PersonName field and lets them go through the 
      //process of adding another member 
      .Field(new FieldReflector<Family>(nameof({AddAnotherMember)) 
      .SetActive((state) => state.AddPerson== true)) 


      .Confirm("Is this your family? {*}") 
      .Build(); 
    } 
} 

누구든지이 작업을 수행하는 방법에 대한 아이디어가 있습니까?

public async Task confirmAdd(IDialogContext context, IAwaitable<bool> result) 
    { 
     if (await result) 
     { 
      // builds and calls the form from here 
      var myform = new FormDialog<BuildFamily>(new BuildFamily(), BuildForm, FormOptions.PromptInStart, null); 
      context.Call<BuildFamily>(myform, End); 
     } 
    } 

    private async Task End(IDialogContext context, IAwaitable<BuildFamily> result) 
    { 
     BuildFamily data = null; 
     try 
     { 
      data = await result; 
      await context.PostAsync("Nice family you got there :)"); 
     } 
     catch (OperationCanceledException) 
     { 
      await context.PostAsync("You canceled the form!"); 
      return; 
     } 
    } 
+0

전체 코드를 게시하여 어떻게 호출하는지 확인할 수 있습니까? – JasonSowers

+0

formflow를 호출하는 코드와 대화 상자의 작동 방식을 명확히하는 몇 가지 추가 코드가 추가되었습니다. 이상적으로 나는 이것이 "옵션"이라는 것을 알고 있지만, "mini"formflow를 호출 할 필요없이 매번 같은 폼 플로우로 유지하는 방법을 찾고 싶습니다. – Witted

+0

동일하게 할 수 없다면 흐름, 이런 종류의 재귀를 수행하는 가장 좋은 방법은 무엇이라고 제안 하시겠습니까? – Witted

답변

0

나는 FormFlow 대화 상자에서 "사용자가 만족할 때까지 질문의 동일한 세트를 통해 재발"하는 방법을 잘 모르겠어요 :

나는이 같은 formflow를 호출합니다. 그러나 사용자에게 "가족 구성원을 추가 하시겠습니까?"라는 질문을 할 수 있습니다. 호출 대화 상자에서 동일한 유형의 대화 흐름을 달성 할 수 있습니다. PostalCode 및 FamilyName 유형 질문을 제거하고 별도의 대화 상자에 넣습니다. 그런 다음 패밀리 추가 대화 상자에서 다음과 같이하십시오.

[Serializable] 
    public class AddFamilyMembersDialog : IDialog<object> 
    { 
     List<Family> _familyMembers = new List<Family>(); 

     public Task StartAsync(IDialogContext context) 
     { 
      context.Wait(MessageReceivedAsync); 

      return Task.CompletedTask; 
     } 

     private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result) 
     { 
      PromptAddMembers(context); 
     } 

     private void PromptAddMembers(IDialogContext context) 
     { 
      PromptDialog.Text(context, AfterPromptAdd, "Would you like to add more family members?", null, 1); 
     } 

     private async Task AfterPromptAdd(IDialogContext context, IAwaitable<string> result) 
     { 
      var yesno = await result; 

      if (yesno.ToLower() == "yes") 
      { 
       await context.Forward(FormDialog.FromForm(Family.BuildForm), AfterAdded, null, CancellationToken.None); 
      } 
      else 
      { 
       //_familyMembers contains everyone the user wanted to add 
       context.Done(true); 
      } 
     } 

     private async Task AfterAdded(IDialogContext context, IAwaitable<Family> result) 
     { 
      var member = await result; 
      if (member != null) 
       _familyMembers.Add(member); 

      PromptAddMembers(context); 
     } 

     [Serializable] 
     public class Family 
     { 
      [Prompt("What is their name?")] 
      public string PersonName { get; set; } 

      [Prompt("How old are they?")] 
      public string PersonAge { get; set; } 

      [Prompt("How are they related to you?")] 
      public string PersonRelation { get; set; } 

      public static IForm<Family> BuildForm() 
      { 
       return new FormBuilder<Family>() 
       .AddRemainingFields() 
       .Build(); 
      } 
     } 

    } 
+0

질문은 폼에 사용자가 비슷한 레이아웃으로 여러 항목을 추가해야하는 경우가 종종있었습니다. 귀하의 대답은 정확하며 나는 그러한 것으로 표시 할 것입니다. 그것은 형태로 그것을하는 어쨌든 있는지 여부를 볼 수 있었다. 내가 사용 하겠지만 : PromptDialog.Confirm (context, AfterPromptAdd, $ "family member?"); 따라서 사용자 응답 범위가 넓어집니다. 귀하의 도움에 감사드립니다. – Witted