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