2017-02-16 8 views
0

BotFurameworkにBotBuilderのC#SDKを使用していて、以下のことを行いたいと思います。BotFramework FormFlowのデフォルトデータを設定する

私はテーブルを予約するための情報を収集するFormFlowダイアログを持っています。 FormFlow内のアイテムの1つがNameを要求しています。別のダイアログで私は名前を集めてuserDataに保存しています。

context.UserData.SetValue<string>("Name", userName); 

私のフォームフローは次のようになります。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using Microsoft.Bot.Builder.FormFlow; 
using Microsoft.Bot.Builder.FormFlow.Advanced; 
using System.Text.RegularExpressions; 
using System.Threading.Tasks; 


namespace DinnerBot.Dialogs 
{ 
    [Serializable] 
    public class ReservationDialog 
    { 

     public enum SpecialOccasionOptions 
     { 
      Birthday, 
      Anniversary, 
      Engagement, 
      none 
     } 

     [Prompt(new string[] { "What is your name?" })] 
     public string Name { get; set; } 

     [Prompt(new string[] { "What is your email?" })] 
     public string Email { get; set; } 

     [Pattern(@"^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$")] 
     public string PhoneNumber { get; set; } 

     [Prompt("What date would you like to dine with us? example: today, tomorrow, or any date like 04-06-2017 {||}", AllowDefault = BoolDefault.True)] 
     [Describe("Reservation date, example: today, tomorrow, or any date like 04-06-2017")] 
     public DateTime ReservationDate { get; set; } 

     public DateTime ReservationTime { get; set; } 

     [Prompt("How many people will be joining us?")] 
     [Numeric(1, 20)] 
     public int? NumberOfDinners; 
     public SpecialOccasionOptions? SpecialOccasion; 

     [Numeric(1, 5)] 
     [Optional] 
     [Describe("for how you enjoyed your experience with Dinner Bot today (optional)")] 
     public double? Rating; 

     public static IForm<ReservationDialog> BuildForm() 
     { 
      return new FormBuilder<ReservationDialog>() 
       .Field(nameof(Name)) 
       .Field(nameof(Email), validate: ValidateContactInformation) 
       .Field(nameof(PhoneNumber)) 
       .Field(nameof(ReservationDate)) 
       .Field(new FieldReflector<ReservationDialog>(nameof(ReservationDialog.ReservationTime)) 
        .SetPrompt(PerLinePromptAttribute("What time would you like to arrive?")) 
        ).AddRemainingFields() 
       .Build(); 
     } 

     private static Task<ValidateResult> ValidateContactInformation(ReservationDialog state, object response) 
     { 
      var result = new ValidateResult(); 
      string contactInfo = string.Empty; 
      if (GetEmailAddress((string)response, out contactInfo)) 
      { 
       result.IsValid = true; 
       result.Value = contactInfo; 
      } 
      else 
      { 
       result.IsValid = false; 
       result.Feedback = "You did not enter valid email address."; 
      } 
      return Task.FromResult(result); 
     } 

     private static bool GetEmailAddress(string response, out string contactInfo) 
     { 
      contactInfo = string.Empty; 
      var match = Regex.Match(response, @"[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?"); 
      if (match.Success) 
      { 
       contactInfo = match.Value; 
       return true; 
      } 
      return false; 
     } 

     private static PromptAttribute PerLinePromptAttribute(string pattern) 
     { 
      return new PromptAttribute(pattern) 
      { 
       ChoiceStyle = ChoiceStyleOptions.PerLine 
      }; 
     } 


    } 
} 

私のルートダイアログでは、このように呼びます。

     context.Call(FormDialog.FromForm<ReservationDialog>(ReservationDialog.BuildForm, 
         FormOptions.PromptInStart), this.ReservationFormComplete); 

どのように私はformflowは、名前フィールドをスキップし、それが存在する場合のuserDataから名前を取ることができますか?

答えて

0

NameプロパティにFieldReflector.SetActiveを定義します。たとえば、次のように続いて

.Field(new FieldReflector<ReservationDialog>(nameof(ReservationDialog.Name)) 
    .SetActive((state) => SetFieldActive(state, nameof(ReservationDialog.Name))) 
    ... 

名がすでに存在し、その場合、stateに値を設定し、falseを返す場合は、あなたのSetFieldActiveデリゲートチェックインチプロンプトは表示されません。名前が見つからない場合は、trueを返してプロンプトを表示します。

私はあなたに興味があるかもしれない。

0

あなたは、いくつかの単純なオプションがあり、このテーマについてa brief blog posta sampleを書きました。
1)フィールドをヌルにして、保存したボット状態からフィールドを設定した場合は、デフォルトでスキップされます。 (FormOptions.PromptFieldsWithValuesを渡さない限り) 2)値をEntityRecommendationsに変換します。フォームのフィールドと一致する場合は、割り当てられてスキップされます。

関連する問題