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

时间:2016-07-20 14:07:53

标签: botframework

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

public enum LengthOptions { SixInch, FootLong };

public enum BreadOptions { NineGrainWheat, NineGrainHoneyOat, Italian, ItalianHerbsAndCheese, Flatbread };

我们可以使用普通列表从数据库中获取值并将其显示为选项吗?

由于

2 个答案:

答案 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();