Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 根据用户确认跳过显示表单字段_C#_Botframework - Fatal编程技术网

C# 根据用户确认跳过显示表单字段

C# 根据用户确认跳过显示表单字段,c#,botframework,C#,Botframework,我在一个类中有大约10个属性,基于这些属性,我有一个表单请求用户输入。我想知道是否有任何机制,在最初的4-5个问题之后,我会询问用户是否想要更多,如果回答是“是”,则会询问下一组字段/问题 我试着用SetDefine做这件事,但是SetDefine的问题是它在每个字段中调用,所以它要求用户在每个字段中进行确认,但我希望它只在第一个可选字段中进行确认,并根据答案跳过全部或全部获取 public async Task StartAsync(IDialogContext context

我在一个类中有大约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);
        }
    }
公共异步任务StartAsync(IDialogContext上下文)
{
wait context.PostAsync($“欢迎使用订单助手!”);
var orderFormDialog=FormDialog.FromForm(BuildOrderAdvanceStepSearchForm,FormOptions.prompinstart);
调用(orderFormDialog,ResumeAfterOrdersFormDialog);
}
私有IForm BuildOrderAdvanceStepSearchForm()
{
返回新的FormBuilder()
.Field(名称(OrderSearchQuery.ItemNumber))
.Field(名称(OrderSearchQuery.Draft))
.Field(名称(OrderSearchQuery.Dispatched))
.Field(名称(OrderSearchQuery.InTransit))
.Field(名称(OrderSearchQuery.Delivered))
//.Confirm(“是否要使用更多选项进行搜索?”)
//.Field(名称(OrderSearchQuery.AddField1))
.Field(新的FieldReflector(名称(OrderSearchQuery.AddField1))
.SetDefine(OrderAdvanceStepConfirmation))
.Field(新的FieldReflector(名称(OrderSearchQuery.AddField2))
.SetDefine(OrderAdvanceStepConfirmation))
.Field(新的FieldReflector(名称(OrderSearchQuery.AddField3))
.SetDefine(OrderAdvanceStepConfirmation))
.Field(新的FieldReflector(名称(OrderSearchQuery.AddField4))
.SetDefine(OrderAdvanceStepConfirmation))
.Field(新的FieldReflector(名称(OrderSearchQuery.AddField5))
.SetDefine(OrderAdvanceStepConfirmation))
.Build();
}
专用静态异步任务OrderAdvanceStepConfirmation(OrderSearchQuery状态,字段)
{
field.SetPrompt(新PrompAttribute($“是否要使用更多选项进行搜索?”);
返回true;
}
私有异步任务ResumeAfterordersFormDialog(IDialogContext上下文,IAwaitable结果)
{
尝试
{
var searchQuery=等待结果;
wait context.PostAsync($“确定。搜索订单…”);
var计数=100;
如果(计数>1)
{
wait context.PostAsync($“我发现总共有100个订单”);
wait context.PostAsync($“要获取订单详细信息,您需要提供更多信息…”);
}
其他的
{
wait context.PostAsync($“我找到了您要找的订单…”);
wait context.PostAsync($“现在我可以为您提供有关此订单的消费品包装、多包装、货架托盘和单位装载量的信息。”);
}
}
捕获(FormCanceledException ex)
{
字符串回复;
if(ex.InnerException==null)
{
reply=“您已取消操作,正在退出订单搜索”;
}
其他的
{
reply=$“哎呀!出问题了:(技术细节:{ex.InnerException.Message}”;
}
等待上下文。PostAsync(回复);
}
最后
{
//context.Done(null);
}
}
我希望它只确认第一个可选字段,并根据答案跳过全部或全部获取

        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);
        }
    }
你可以使用

例如,创建一个用于确认的枚举,例如:

public enum Confirmation
{
    Yes,
    No
}

public Confirmation? Corfirm { get; set; }
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();
然后您可以像这样构建
表单

public enum Confirmation
{
    Yes,
    No
}

public Confirmation? Corfirm { get; set; }
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();
返回新的FormBuilder()
.字段(名称(项目编号))
.字段(名称(草稿))
.Field(新FieldReflector(公司名称))
.SetNext((值、状态)=>
{
var选择=(确认)值;
如果(选择==确认。是)
{
//转到步骤1
返回新的NextStep();
}
其他的
{
//跳过以下步骤
state.Stpe1=null;
state.Step2=null;
返回新的下一步(StepDirection.Complete);
}
})
)
.字段(名称(Stpe1))
.Field(nameof(Step2)).Build();
我希望它只确认第一个可选字段,并根据答案跳过全部或全部获取

        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);
        }
    }
你可以使用

例如,创建一个用于确认的枚举,例如:

public enum Confirmation
{
    Yes,
    No
}

public Confirmation? Corfirm { get; set; }
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();
然后您可以像这样构建
表单

public enum Confirmation
{
    Yes,
    No
}

public Confirmation? Corfirm { get; set; }
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();
返回新的FormBuilder()
.字段(名称(项目编号))
.字段(名称(草稿))
.Field(新FieldReflector(公司名称))
.SetNext((值、状态)=>
{
var选择=(确认)值;
如果(选择==确认。是)
{
//转到步骤1
返回新的NextStep();
}
其他的
{
//跳过以下步骤
state.Stpe1=null;
state.Step2=null;
返回新的下一步(StepDirection.Complete);
}
})
)
.字段(名称(Stpe1))
.Field(nameof(Step2)).Build();