Botframework Microsoft Bot:从数据库而不是枚举显示选项

Botframework Microsoft Bot:从数据库而不是枚举显示选项,botframework,Botframework,在Microsoft的bot实现示例中,它们使用枚举定义对话框的选项,如下例所示: public enum LengthOptions { SixInch, FootLong }; public enum BreadOptions { NineGrainWheat, NineGrainHoneyOat, Italian, ItalianHerbsAndCheese, Flatbread }; 我们是否可以使用普通列表从数据库中获取值并将其显示为选项 谢谢您不能开箱即用,但是您可以将子类化为F

在Microsoft的bot实现示例中,它们使用枚举定义对话框的选项,如下例所示:

public enum LengthOptions { SixInch, FootLong };

public enum BreadOptions { NineGrainWheat, NineGrainHoneyOat, Italian, ItalianHerbsAndCheese, Flatbread };
我们是否可以使用普通列表从数据库中获取值并将其显示为选项


谢谢

您不能开箱即用,但是您可以将
子类化为FormBuilderBase
,覆盖各种方法,使用您喜欢的任何数据源构建
表单

编辑:

您可以在此处找到
FormBuilder
的基类和实现:

基本上,有许多虚拟方法可以重写,以自定义表单的行为方式,但主要的方法是
Build
。在默认实现中,它迭代枚举以创建
字段的列表,这些字段基本上是表单中的每个步骤。相反,您可以迭代从数据库中提取的任何数据,并为每个项目创建一个新的
字段。它可能看起来像这样:

public override IForm<T> Build(Assembly resourceAssembly = null, string resourceName = null)
{
    var list = GetListOfItemsFromDatabase();
    foreach (var item in _list)
    {
        // FieldFromItem is an IField and will also need to be created
        Field(new FieldFormItem<T>(item));
    }
    Confirm(new PromptAttribute(_form.Configuration.Template(TemplateUsage.Confirmation)));
    }
    return base.Build(resourceAssembly, resourceName);
}
public重写表单生成(Assembly-resourcesassembly=null,string-resourceName=null)
{
var list=GetListOfItemsFromDatabase();
foreach(列表中的var项)
{
//FieldFromItem是一个IField,也需要创建
字段(新字段格式项(项));
}
确认(新的prompattribute(_form.Configuration.Template(TemplateUsage.Confirmation));
}
返回base.Build(resourceAssembly,resourceName);
}

您不能开箱即用,但您可以将
子类化为FormBuilderBase
,覆盖各种方法,使用您喜欢的任何数据源构建
表单

编辑:

您可以在此处找到
FormBuilder
的基类和实现:

基本上,有许多虚拟方法可以重写,以自定义表单的行为方式,但主要的方法是
Build
。在默认实现中,它迭代枚举以创建
字段的列表,这些字段基本上是表单中的每个步骤。相反,您可以迭代从数据库中提取的任何数据,并为每个项目创建一个新的
字段。它可能看起来像这样:

public override IForm<T> Build(Assembly resourceAssembly = null, string resourceName = null)
{
    var list = GetListOfItemsFromDatabase();
    foreach (var item in _list)
    {
        // FieldFromItem is an IField and will also need to be created
        Field(new FieldFormItem<T>(item));
    }
    Confirm(new PromptAttribute(_form.Configuration.Template(TemplateUsage.Confirmation)));
    }
    return base.Build(resourceAssembly, resourceName);
}
public重写表单生成(Assembly-resourcesassembly=null,string-resourceName=null)
{
var list=GetListOfItemsFromDatabase();
foreach(列表中的var项)
{
//FieldFromItem是一个IField,也需要创建
字段(新字段格式项(项));
}
确认(新的prompattribute(_form.Configuration.Template(TemplateUsage.Confirmation));
}
返回base.Build(resourceAssembly,resourceName);
}

我知道时间很晚了,但我发现自己也在努力解决这个问题,并发现下面是解决这个问题的正确方法。在FormFlow类中,只需手动添加术语和说明。从您的示例中,如果我们讨论的是长度选项,则在构建表单时将LengthOptions的类型更改为string添加以下代码

           return new FormBuilder<SandwichForm>()
                .Field(new FieldReflector<SandwichForm>(nameof(LengthOptions))
                        .SetDefine(async (state, field) =>
                        {
                            // Call database and get options and iterate over the options
                            field
                            .AddDescription("SixInch","Six Inch")
                            .AddTerms("SixInch", "Six Inch")
                            .AddDescription("FootLong ","Foot Long")
                            .AddTerms("FootLong ", "Foot Long")
                            return true;
                        }))
                .OnCompletion(completionDelegate)
                .Build();
返回新的FormBuilder()
.字段(新字段反射器(名称(长度选项))
.SetDefine(异步(状态、字段)=>
{
//调用数据库并获取选项,然后迭代这些选项
领域
.AddDescription(“六英寸”、“六英寸”)
.AddTerms(“六英寸”、“六英寸”)
.AddDescription(“英尺长”、“英尺长”)
.AddTerms(“英尺长”、“英尺长”)
返回true;
}))
.OnCompletion(completionDelegate)
.Build();

我知道时间很晚了,但我发现自己也在努力解决这个问题,并发现下面是解决这个问题的正确方法。在FormFlow类中,只需手动添加术语和说明。从您的示例中,如果我们讨论的是长度选项,则在构建表单时将LengthOptions的类型更改为string添加以下代码

           return new FormBuilder<SandwichForm>()
                .Field(new FieldReflector<SandwichForm>(nameof(LengthOptions))
                        .SetDefine(async (state, field) =>
                        {
                            // Call database and get options and iterate over the options
                            field
                            .AddDescription("SixInch","Six Inch")
                            .AddTerms("SixInch", "Six Inch")
                            .AddDescription("FootLong ","Foot Long")
                            .AddTerms("FootLong ", "Foot Long")
                            return true;
                        }))
                .OnCompletion(completionDelegate)
                .Build();
返回新的FormBuilder()
.字段(新字段反射器(名称(长度选项))
.SetDefine(异步(状态、字段)=>
{
//调用数据库并获取选项,然后迭代这些选项
领域
.AddDescription(“六英寸”、“六英寸”)
.AddTerms(“六英寸”、“六英寸”)
.AddDescription(“英尺长”、“英尺长”)
.AddTerms(“英尺长”、“英尺长”)
返回true;
}))
.OnCompletion(completionDelegate)
.Build();

谢谢,你能给出一些更详细的示例吗?谢谢,你能给出一些更详细的示例吗?但这并不像枚举那样显示选项;对吗?@Jasper完全一样……只有dynamicb,但这并不像enum那样显示选项;对吗?@Jasper这完全是一样的东西…只是动态的