Bot框架 - 动态FormFlow取决于以前的答案

时间:2017-01-04 01:57:54

标签: c# botframework

我对此有点困惑,甚至不知道它是否完全有可能。在网上搜索我发现了像Joe Mayo这样的帖子:http://mayoster.blogspot.com.es/2016/05/dynamic-formflow-forms-in-bot-builder.html他解释了如何使用动态字段而不是预定义的枚举。

到目前为止,真正的问题是,当值不是“在某处定义”时,而是依赖于FormFlow的先前答案。这可能吗? (考虑到Form Build是一次完成的吗?

示例:

public static IForm<ItemQueue> BuildForm()
    {

        return new FormBuilder<ItemQueue>()                
            .Field(nameof(ItemQueue.ItemFamily))
            .Field(nameof(ItemQueue.ItemType))
            .Field(new FieldReflector<ItemQueue>(nameof(ItemGroup))
                .SetType(null)
                .SetDefine((state, field) =>
                {
                    List<string> groupList= GetItemGroups(//PREVIOUS ANSWER HERE);

                    foreach (var group in groupList)
                        field
                             .AddDescription(module, module)
                             .AddTerms(module, module);
                    return Task.FromResult(true);

                }))
            .AddRemainingFields()
            .Build()
            ;
    }

如果“// PREVIOUS ANSWER HERE”部分确定区域,则应加载字符串。尝试了我能想到的一切,并且没有成功地搜索过,主要是因为它只是一步执行。

基于一些观点,显然有一个选择是,在我得到我想要的答案之后,用存储的值开始一个新的FormFlow,但似乎不是最干净的方法。

我非常感谢有关此事的任何帮助。

提前致谢。

1 个答案:

答案 0 :(得分:0)

终于明白了!

结束你可以找到前面字段的状态并将其(例如字符串)发送到新函数:

public static IForm<ItemQueue> BuildForm()
{

    return new FormBuilder<ItemQueue>()                
        .Field(nameof(ItemQueue.ItemFamily))
        .Field(nameof(ItemQueue.ItemType))
        .Field(new FieldReflector<ItemQueue>(nameof(ItemGroup))
            .SetType(null)
            .SetDefine((state, field) =>
            {
                List<string> groupList= GetItemGroups(state.ItemType.ToString());

                foreach (var group in groupList)
                    field
                         .AddDescription(module, module)
                         .AddTerms(module, module);
                return Task.FromResult(true);

            }))
        .AddRemainingFields()
        .Build()
        ;
}

但是,你必须要注意这个价值只有&#34;可用&#34;进入{Get;之后的下一个字段(如果存在)组;}。否则它将保持为空。

也就是说,在我的示例中,我可以获得 ItemType 值,因为在执行 ItemGroup 字段之前,它已经定义了前一个的值。

.Field 覆盖之外,如果您想将其称为 .OnCompletion ,则必须从&#34;字段&#34;属性。