根据用户确认跳过显示表单域

时间:2017-12-11 20:25:36

标签: c# botframework

我在一个类中有10个属性,并且基于这些属性,我有一个要求用户输入的表单。我想知道是否有任何机制,在最初的4-5个问题之后,我问用户他/她是否想要更多,如果答复是肯定的,则会询问下一组字段/问题。

我尝试使用SetDefine,但是SetDefine的问题是每个字段调用它所以它要求用户确认每个fiels但我希望它只用第一个可选字段确认并根据答案跳过全部或得到所有。

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

1 个答案:

答案 0 :(得分:2)

  

我希望它只与第一个可选字段一起确认,并根据答案跳过全部或全部。

您可以使用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();