在Microsoft的示例bot实现中,他们使用枚举来定义对话框的选项,如下例所示:
public enum LengthOptions { SixInch, FootLong };
public enum BreadOptions { NineGrainWheat, NineGrainHoneyOat, Italian, ItalianHerbsAndCheese, Flatbread };
我们可以使用普通列表从数据库中获取值并将其显示为选项吗?
由于
答案 0 :(得分:1)
你无法开箱即用,但你可以继承FormBuilderBase<T>
,覆盖各种方法,使用你喜欢的任何数据源来构建Form
。
修改强>
您可以在此处找到FormBuilder
的基类和实现:https://github.com/Microsoft/BotBuilder/blob/master/CSharp/Library/FormFlow/FormBuilder.cs
基本上,您可以覆盖一堆虚拟方法来自定义您希望表单的行为方式,但主要方法是Build
。在默认实现中,它迭代枚举以创建Field
列表,这基本上是您表单中的每一步。而不是那样,您可以遍历从数据库中提取的任何数据,并为每个项目创建一个新的Field
。它可能看起来像这样:
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);
}
答案 1 :(得分:1)
我知道它已经很晚了,但发现自己也在努力解决这个问题,并发现下面的内容是正确的解决方案。在你的FormFlow课程中,只需手动添加术语和描述。如果我们谈论的是长度选项,那么请更改在构建表单时,String的LengthOptions类型添加以下代码。
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();