2017-12-11 10 views
0

クラスに10個のプロパティがあり、それらのプロパティに基づいてユーザーの入力を求めるフォームがあります。私は最初の4-5の質問の後に私は彼/彼女がもっと欲しいかどうかを尋ね、回答がイエスならば次のフィールド/質問のセットが尋ねられるという仕組みがあるかどうかを知りたい。ユーザー確認に基づいてフォームフィールドを表示しないようにする

私はSetDefineでそれをやってみましたが、SetDefineで問題が発生したのは、フィールドごとに呼び出され、各フィールドで確認するようにしていますが、最初のオプションフィールドでのみ確認し、またはすべてを得る。

 public async Task StartAsync(IDialogContext context) 
    { 
     await context.PostAsync($"Welcome to the Order helper!"); 

     var orderFormDialog = FormDialog.FromForm(BuildOrderAdvanceStepSearchForm, FormOptions.PromptInStart); 

     context.Call(orderFormDialog, ResumeAfterOrdersFormDialog); 
    } 

    private IForm<OrderSearchQuery> BuildOrderAdvanceStepSearchForm() 
    { 
     return new FormBuilder<OrderSearchQuery>() 
      .Field(nameof(OrderSearchQuery.ItemNumber)) 
      .Field(nameof(OrderSearchQuery.Draft)) 
      .Field(nameof(OrderSearchQuery.Dispatched)) 
      .Field(nameof(OrderSearchQuery.InTransit)) 
      .Field(nameof(OrderSearchQuery.Delivered)) 
      //.Confirm("Do you want to search with more options?.") 
      //.Field(nameof(OrderSearchQuery.AddField1)) 
      .Field(new FieldReflector<OrderSearchQuery>(nameof(OrderSearchQuery.AddField1)) 
       .SetDefine(OrderAdvanceStepConfirmation)) 
      .Field(new FieldReflector<OrderSearchQuery>(nameof(OrderSearchQuery.AddField2)) 
       .SetDefine(OrderAdvanceStepConfirmation)) 
      .Field(new FieldReflector<OrderSearchQuery>(nameof(OrderSearchQuery.AddField3)) 
       .SetDefine(OrderAdvanceStepConfirmation)) 
      .Field(new FieldReflector<OrderSearchQuery>(nameof(OrderSearchQuery.AddField4)) 
       .SetDefine(OrderAdvanceStepConfirmation)) 
      .Field(new FieldReflector<OrderSearchQuery>(nameof(OrderSearchQuery.AddField5)) 
       .SetDefine(OrderAdvanceStepConfirmation)) 
      .Build(); 
    } 

    private static async Task<bool> OrderAdvanceStepConfirmation(OrderSearchQuery state, Field<OrderSearchQuery> field) 
    { 
     field.SetPrompt(new PromptAttribute($"Do you want to search with more options?.")); 
     return true; 
    } 

    private async Task ResumeAfterordersFormDialog(IDialogContext context, IAwaitable<OrderSearchQuery> result) 
    { 
     try 
     { 
      var searchQuery = await result; 

      await context.PostAsync($"Ok. Searching for orders..."); 

      var count = 100; 

      if (count > 1) 
      { 
       await context.PostAsync($"I found total of 100 orders"); 

       await context.PostAsync($"To get order details, you will need to provide more info..."); 

      } 
      else 
      { 
       await context.PostAsync($"I found the order you were looking for..."); 

       await context.PostAsync($"Now I can provide you information related to Consumer Package, Multi-Pack, Shelf Tray & Unit Load for this order."); 
      } 

     } 
     catch (FormCanceledException ex) 
     { 
      string reply; 

      if (ex.InnerException == null) 
      { 
       reply = "You have canceled the operation. Quitting from the order Search"; 
      } 
      else 
      { 
       reply = $"Oops! Something went wrong :(Technical Details: {ex.InnerException.Message}"; 
      } 

      await context.PostAsync(reply); 
     } 
     finally 
     { 
      //context.Done<object>(null); 
     } 
    } 

答えて

2

私はそれだけですべてをスキップしたり、すべての取得のいずれか1任意のフィールドを確認し、回答に基づいてしたいと思います。

SetNextFieldReflectorとすることができます。

public enum Confirmation 
{ 
    Yes, 
    No 
} 

public Confirmation? Corfirm { get; set; } 

をそして、あなたは、このようなFormを構築することができます:

は、例えば、このような例確認のために列挙型を作成

return new FormBuilder<OrderSearchQuery>() 
    .Field(nameof(ItemNumber)) 
    .Field(nameof(Draft)) 
    .Field(new FieldReflector<OrderSearchQuery>(nameof(Corfirm)) 
      .SetNext((value, state) => 
      { 
       var selection = (Confirmation)value; 
       if (selection == Confirmation.Yes) 
       { 
        //go to step 1 
        return new NextStep(); 
       } 
       else 
       { 
        //skip the following steps 
        state.Stpe1 = null; 
        state.Step2 = null; 
        return new NextStep(StepDirection.Complete); 
       } 
      }) 
    ) 
    .Field(nameof(Stpe1)) 
    .Field(nameof(Step2)).Build(); 
+0

感謝を...魔法のように動作します... –

関連する問題