Bot框架表单流对话框列表?

时间:2017-02-24 16:08:25

标签: c# .net botframework

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Web;
using BotVetAlpha3.Core;
using Microsoft.Bot.Builder.FormFlow;

namespace BotVetAlpha3.Dialog
{
public enum SandwichOptions
{
    BLT, BlackForestHam, BuffaloChicken, ChickenAndBaconRanchMelt, ColdCutCombo, MeatballMarinara,
    OvenRoastedChicken, RoastBeef, RotisserieStyleChicken, SpicyItalian, SteakAndCheese, SweetOnionTeriyaki, Tuna,
    TurkeyBreast, Veggie
};
public enum LengthOptions { SixInch, FootLong };
public enum BreadOptions { NineGrainWheat, NineGrainHoneyOat, Italian, ItalianHerbsAndCheese, Flatbread };
public enum CheeseOptions { American, MontereyCheddar, Pepperjack };
public enum ToppingOptions
{
    Avocado, BananaPeppers, Cucumbers, GreenBellPeppers, Jalapenos,
    Lettuce, Olives, Pickles, RedOnion, Spinach, Tomatoes
};
public enum SauceOptions
{
    ChipotleSouthwest, HoneyMustard, LightMayonnaise, RegularMayonnaise,
    Mustard, Oil, Pepper, Ranch, SweetOnion, Vinegar
};




[Serializable]
public class RootDialog
{

    public SandwichOptions? Sandwich;
    public LengthOptions? Length;
    public BreadOptions? Bread;
    public CheeseOptions? Cheese;
    public List<ToppingOptions> Toppings;
    public List<SauceOptions> Sauce;

    public static IForm<RootDialog> BuildForm()
    {
        return new FormBuilder<RootDialog>()
                .Message("Welcome to the simple sandwich order bot!")
                .Build();
    }
};

}

所以这是我目前的课程,来自MS的一个例子,但我想改变它,我一直在尝试这样做,但我不能...... 我想要做的不是使用枚举来构建我想要使用字符串列表的对话框。那可能吗 ?如果这是所有的帮助是受欢迎的我一直在用这个敲打墙... 查找有关此主题的信息也非常困难。

2 个答案:

答案 0 :(得分:3)

我打算走出困境并假设您还想动态指定这些字符串?好吧,让我们一起踏上一段小路。

首先让我们从定义表单开始

using Microsoft.Bot.Builder.FormFlow;
using Microsoft.Bot.Builder.FormFlow.Advanced;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace pc.Bot.Form
{
    [Serializable]
    public class MyForm
    {
        public MyForm(List<string> Names) { _names = Names; }

        List<string> _names;

       [Template(TemplateUsage.NotUnderstood, "**{0}** isn't a valid selection",  ChoiceStyle = ChoiceStyleOptions.PerLine)]
       [Prompt("**Choose from the following names**:  {||}")]
       public List<string> Names { get; set; }

       public static IForm<MyForm> BuildForm() {
            return new FormBuilder<MyForm>()
             .Field(new FieldReflector<MyForm>(nameof(Names))
                .SetType(null)
                .SetActive(form => form._names != null && form._names.Count > 0)
                .SetDefine(async (form, field) =>
                {
                    form?._names.ForEach(name=> field.AddDescription(name, name).AddTerms(name, name));

                    return await Task.FromResult(true);
                }))
            .Build();
        }
    }
}

现在注意我们的表单是可序列化的,并且有一个构造函数,它接受一个字符串列表,然后在我们的BuildForm静态函数中,我们添加了Names字段并动态填充它。

现在让我们来看看我们的对话框

using Microsoft.Bot.Builder.Dialogs;
using Microsoft.Bot.Builder.FormFlow;
using pc.Bot.Form;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace pc.Bot.Dialogs
{
    [Serializable]
    public class RootDialog : IDialog<object>
    {
        public async Task StartAsync(IDialogContext context)
        {
            context.Wait(MessageReceivedAsync);

            await Task.CompletedTask;
        }

        private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)
        {
            var names = new List<string>() { "Pawel", "Tomek", "Marin", "Jakub", "Marco" };
            var form = new FormDialog<MyForm>(new MyForm(names), MyForm.BuildForm, FormOptions.PromptInStart);

            context.Call(form, Form_Callback);

            await Task.CompletedTask;
        }

       private async Task Form_Callback(IDialogContext context, IAwaitable<MyForm> result)
       {
           var formData = await result;

           //output our selected names form our form
           await context.PostAsync("You selected the following names:");
           await context.PostAsync(formData.Names?.Aggregate((x, y) => $"{x}, {y}") ?? "No names to select" );
       }
   }
}

现在在我们的对话框中,当我们在表单对话框类的构造函数中实例化我们的表单时,我们只需传入我们的名称列表。如果您不想从对话框中传递列表,则只需在表单的构造函数中设置_names字段即可。

我确信自从原始问题以来你已经开始了你的生活,但是如果有其他人遇到这篇文章,这可能对他们有帮助。

有一点需要注意,这是我第二周使用僵尸框架,所以如果这是一些可怕的做法或有一些严重的后果,请在我投入生产之前给我一个抬头。

答案 1 :(得分:0)

我想我迟到了,但我得到了答案! FormFlow对话框不允许您将List作为字段传递给与用户对话时收集:(

允许的类型:

  
      
  • Integral - sbyte,byte,short,ushort,int,uint,long,ulong
  •   
  • 浮点 - 浮点数,双倍
  •   
  • 字符串
  •   
  • 日期时间
  •   
  • Enum
  •   
  • 枚举列表
  •   

Source

P.S。最近我遇到了同样的问题:我的问题存储在外部数据库中,我想让机器人问他们,但是没有明确的方法可以做到:(无论如何,请求专​​家帮助解决这个问题!