C# Microsoft Bot框架动态选项问题

C# Microsoft Bot框架动态选项问题,c#,botframework,azure-language-understanding,C#,Botframework,Azure Language Understanding,我正在尝试使用FormBuilder和Microsoft Bot framework构建表单。我需要动态添加选项 我可以添加它(状态),但当我选择一个状态时,流本身就结束了 请在下面查找示例代码: public enum StatesOptions { } public enum BranchOptions { } [Serializable] public class AppointmentQuery { [Prompt("Please enter {&}")]

我正在尝试使用FormBuilder和Microsoft Bot framework构建表单。我需要动态添加选项

我可以添加它(状态),但当我选择一个状态时,流本身就结束了

请在下面查找示例代码:

public enum StatesOptions
{

}

public enum BranchOptions
{

}

[Serializable]
public class AppointmentQuery
{
    [Prompt("Please enter {&}")]
    [Required(AllowEmptyStrings = false, ErrorMessage = "Please enter your Name, it is a mandatory field")]
    public string Name;

    [Prompt("Please enter {&}")]
    [Required(AllowEmptyStrings = false, ErrorMessage = "Please enter your Email, it is a mandatory field")]
    [EmailAddressAttribute(ErrorMessage = "Email Id is invalid")]
    public string Email;

    [Prompt("Please enter {&}")]
    [Required(AllowEmptyStrings = false, ErrorMessage = "Please enter appointment date, it is a mandatory field")]
    [EmailAddressAttribute(ErrorMessage = "Appointment date is invalid")]
    public DateTime ApptDate;

    [Prompt("Please enter {&}")]
    public StatesOptions States;

    public string SelectedState;

    [Prompt("Please enter {&}")]
    [Required(AllowEmptyStrings = false, ErrorMessage = "Please enter your Email, it is a mandatory field")]
    [EmailAddressAttribute(ErrorMessage = "Email Id is invalid")]
    public string NewEmail;

    [Prompt("Please enter {&}")]
    public BranchOptions? Branches;

    public string SelectedBranch;

    public static IForm<AppointmentQuery> BuildAppointmentBookingForm()
    {
        OnCompletionAsyncDelegate<AppointmentQuery> bookAppointment = async (context, state) =>
        {


        };
        return new FormBuilder<AppointmentQuery>()
           .Field(nameof(Name))
           .Field(nameof(Email))
           .Field(nameof(ApptDate))              
           //.Field(nameof(States))
           .Field(new FieldReflector<AppointmentQuery>(nameof(States))
                .SetActive((state) => true)
                .SetPrompt(new PromptAttribute("Please select one of the state from the following options: {||}")
                {
                    ChoiceStyle = ChoiceStyleOptions.Buttons
                })
                .SetDefine((state, field) =>
                {
                    var data = new FeedStateData().feedData();
                    var states = data.Select(r => r.StateName);

                    foreach (var item in states)
                    {
                        field
                            .AddDescription(item, item)
                            .AddTerms(item, item);
                        //return true;
                    }
                    return Task.FromResult(true);                        
                })
                .SetNext((value, state) =>
                {
                    var selection = (States)value;
                    state.SelectedState = selection.StateName.ToString();

                    return new NextStep(new[] { nameof(Branches) });

                }))
          .OnCompletion(bookAppointment)
           .Build();
    }

}
公共枚举状态选项
{
}
公共枚举分支机构
{
}
[可序列化]
公共类任命查询
{
[提示(“请输入{&}”)]
[必需(AllowEmptyStrings=false,ErrorMessage=“请输入您的姓名,这是必填字段”)]
公共字符串名称;
[提示(“请输入{&}”)]
[必需(AllowEmptyStrings=false,ErrorMessage=“请输入您的电子邮件,这是必填字段”)]
[EmailAddressAttribute(ErrorMessage=“电子邮件Id无效”)]
公共字符串电子邮件;
[提示(“请输入{&}”)]
[必需(AllowEmptyStrings=false,ErrorMessage=“请输入约会日期,这是必填字段”)]
[EmailAddressAttribute(ErrorMessage=“约会日期无效”)]
公共日期时间ApptDate;
[提示(“请输入{&}”)]
公共国家国家;
公共字符串SelectedState;
[提示(“请输入{&}”)]
[必需(AllowEmptyStrings=false,ErrorMessage=“请输入您的电子邮件,这是必填字段”)]
[EmailAddressAttribute(ErrorMessage=“电子邮件Id无效”)]
公共字符串NewEmail;
[提示(“请输入{&}”)]
公共分支机构?分支机构;
公共字符串SelectedBranch;
公共静态表单BuildAppointBookingForm()
{
OnCompletionAsyncDelegate bookAppointment=async(上下文、状态)=>
{
};
返回新的FormBuilder()
.字段(名称)
.字段(姓名(电子邮件))
.字段(名称(应用日期))
//.领域(国家名称)
.Field(新的FieldReflector(国家名称))
.SetActive((状态)=>true)
.SetPrompt(新PrompAttribute(“请从以下选项中选择一个状态:{| |}”)
{
ChoiceStyle=ChoiceStyleOptions.Buttons
})
.SetDefine((状态、字段)=>
{
var数据=新的FeedStateData().feedData();
var states=data.Select(r=>r.StateName);
foreach(状态中的var项目)
{
领域
.AddDescription(项目,项目)
.AddTerms(项目,项目);
//返回true;
}
返回Task.FromResult(true);
})
.SetNext((值、状态)=>
{
var选择=(状态)值;
state.SelectedState=selection.StateName.ToString();
返回新的NextStep(new[]{nameof(branchs)});
}))
.OnCompletion(预约)
.Build();
}
}
另外,我需要向它添加另一个动态字段分支,但代码并没有到达它,即分支,并没有抛出异常,但表单不起作用

请查找分支字段的示例代码

.Field(new FieldReflector<AppointmentQuery>(nameof(Branches))
                .SetActive((state) => true)
                .SetPrompt(new PromptAttribute("Please select branch from following options: {||}")
                {
                    ChoiceStyle = ChoiceStyleOptions.Buttons
                })
                .SetDefine((state, field) =>
                {
                    var data = new FeedStateData().feedData();
                    var states = data.Select(r => r.StateName);
                    var bracnhList = data.Where(s => s.StateName == state.SelectedState).Select(a => a.Branches).FirstOrDefault().Select(n => n.BranchName).ToList();

                    foreach (var item in bracnhList)
                    {
                        field
                            .AddDescription(item, item)
                            .AddTerms(item);

                    }
                    return Task.FromResult(true);
                })
                .SetNext((value, state) =>
                {
                    var selection = (Branch)value;
                    state.SelectedBranch = selection.ToString();

                    return new NextStep(new[] { nameof(Branches) });

                }))
.Field(新的FieldReflector(分支机构名称))
.SetActive((状态)=>true)
.SetPrompt(新PrompAttribute(“请从以下选项中选择分支:{| |}”)
{
ChoiceStyle=ChoiceStyleOptions.Buttons
})
.SetDefine((状态、字段)=>
{
var数据=新的FeedStateData().feedData();
var states=data.Select(r=>r.StateName);
var branchlist=data.Where(s=>s.StateName==state.SelectedState).Select(a=>a.branchs.FirstOrDefault().Select(n=>n.BranchName).ToList();
foreach(BranchList中的变量项)
{
领域
.AddDescription(项目,项目)
.附加条款(项目);
}
返回Task.FromResult(true);
})
.SetNext((值、状态)=>
{
var选择=(分支)值;
state.SelectedBranch=selection.ToString();
返回新的NextStep(new[]{nameof(branchs)});
}))

有人能帮我吗?

我得到了答案,每个字段项都会在每个响应中得到评估。所以,即使未填充SelectedState的值,也会计算下面的行

var branchlist=data.Where(s=>s.StateName==state.SelectedState).Select(a=>a.branchs).FirstOrDefault().Select(n=>n.BranchName).ToList()

为了解决这个问题,我在上面加了一张支票

if(!string.IsNullOrEmpty(state.SelectedState))
请建议是否有更好的方法