2017-02-24 10 views
0
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の例から、私の現在のクラスですが、私は、私はそれをやろうとしてきたが、Imはできない、それを変更したい...私は何をしたいのか は、列挙型を使用して代わりにである私のダイアログを構築するには文字列のリスト。それは可能ですか?それはすべてのヘルプは、私はこれで壁に叩いてきた歓迎されている場合... は、このテーマに関する情報を見つけることも非常に困難です。BotフレームワークFormflowダイアログ(リストあり)?

答えて

0

私は遅刻と思いますが、私は答えを持っています! FormFlowダイアログは、ユーザーとの会話の中で収集するために、あなたはフィールドとしてリストを渡すことはできません:(

可タイプ:

  • インテグラ - sbyte、バイト、ショート、USHORT、INT、UINT、長い、ULONG
  • 浮動小数点 - float型、ダブル
  • 文字列
  • のDateTime
  • 列挙
  • 列挙型

Source

P.S.の

  • 一覧最近、私は同じ問題に直面している:私の質問は、外部のデータベースに格納され、私はそれらを依頼するボットを望んでいたが、とにかく:(それを行うための明確な方法はありません、この質問のための専門家の助けを要求した

  • +0

    お返事ありがとうございました!しかし、私はすでにこのリンク[リンク](http://mayoster.blogspot.pt/2016/05/dynamic-formflow-forms-in-bot-builder.html)をチェックFormflowでリストを使用するためには、考え出しました。 私はこれがあなたを助けてくれることを願っています:) –

    +0

    @CHxXqこの記事も見ましたが、外部リソースから質問するようにできましたか? 私はフィールドのボタンではなく、動的にボタンの列挙を設定します。 作成した場合、コードを共有できますか? –

    +0

    この画像を確認する(画像)(http://prntscr.com/ez6abc)これは役に立ちます;) –

    0

    を私は行きますよ!手足に出て行って、あなたはまた、動的にこれらの文字列を指定したいと想定するの?うまく者が一緒に少し旅を下に実行してみましょう。

    を最初に今私達のフォームことに気づくのは、フォーム

    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フィールドとdynを追加しますそれを積極的に設定します。

    今、我々は単に私たちの名前のリストを渡すフォームダイアログクラスのコンストラクタで、フォームのインスタンスを作成するとき私たちのダイアログで、今、私たちダイアログ

    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フィールドを設定するだけです。

    私はあなたが元の質問以来、あなたの生活に移動したと確信しているが、他の誰かがこの投稿を渡って来る場合、これは彼らを助けるかもしれません。

    ボットフレームワークの作業の2週間目ですが、これは恐ろしい練習や重大な結果を招く場合は、私が生産に行く前に頭を上げてください。

    関連する問題