2016-12-26 10 views
0

私は2つのフォームを持っています。私はユーザーの入力に基づいて両方のフォームにアクセスする必要があります。複数のフォームがMicrosoftのbotフレームワーク

internal static IDialog<JObject> BuildTravelForm() 
    { 
     travelstatus = 1; 
     leaveStatus = 0; 
     return Chain.From(() => FormDialog.FromForm(TravelForm.BuildForm)) 
      .Do(async (context, order) => 
      { 
       try 
       { 
        travelstatus = 0; 
        var completed = await order; 
        string source = (string)completed.GetValue("Question1"); 
        string destination = (string)completed.GetValue("Question2"); 
        await context.PostAsync("Your travel request is awaiting approval" + " " + "from" + " " + source + " " + "to" + " " + destination); 
       } 
       catch (Exception) 
       { 

        await context.PostAsync("Thank you"); 
       } 
      }); 
    } 

第二つ

public async Task<Activity> Post([FromBody]Activity activity) 
    { 

     try 
     { 
      if (activity.Type == ActivityTypes.Message) 
      { 
       if (leaveStatus == 1 && travelstatus==0) 
       { 
        //nested if to check intents to follow 
        await Conversation.SendAsync(activity, BuildLeaveForm); 
       } 
       else if(travelstatus == 1 && leaveStatus==0) 
       { 
        await Conversation.SendAsync(activity, BuildTravelForm); 
       } 
       else 
       { 
        ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl)); 
        StateClient stateClient = activity.GetStateClient(); 
        string replyMessage = ""; 
        Luis stluis = await GetEntityFromLUIS(activity.Text); 
        if (stluis.intents.Count() > 0) 
        { 
         Activity reply; 
         ///await Conversation.SendAsync(activity, MakeGreetings); 
         using (var file = Assembly.GetExecutingAssembly().GetManifestResourceStream("Javis_V2.IntentLibrary.json")) 
         { 
          o2 = JObject.Parse(new StreamReader(file).ReadToEnd()); 
          string luisIntent = stluis.intents[0].intent; 
          if (luisIntent == "LeaveManager") 
          { 
           await Conversation.SendAsync(activity, BuildLeaveForm); 
          } 
          else if(luisIntent=="TravelManager") 
          { 
           await Conversation.SendAsync(activity, BuildTravelForm); 
          } 
          else 
          { 
           leaveStatus = 0; 
           travelstatus = 0; 
           replyMessage = (string)o2.GetValue(luisIntent); 
           if(replyMessage=="") 
           { 
            replyMessage = "Sorry! Not getting you"; 
           } 
           reply = activity.CreateReply(replyMessage); 
           await connector.Conversations.ReplyToActivityAsync(reply); 
          } 
         } 
        } 
       } 
      } 
      else 
      { 
       HandleSystemMessage(activity); 
      } 
      return null; 

     } 
     catch (Exception exp) 
     { 
      Debug.WriteLine(exp); 
      return null; 
     } 
    } 

問題は、その最初の形態であるが、以下のように制御方法がある。この

internal static IDialog<JObject> BuildLeaveForm() 
    { 
     leaveStatus = 1; 
     travelstatus = 0; 
     return Chain.From(() => FormDialog.FromForm(LeaveForm.BuildForm)) 
      .Do(async (context,order)=> 
     { 
      leaveStatus = 0; 
      var completed = await order; 
      string startDate = (string)completed.GetValue("Question1"); 
      string endDate = (string)completed.GetValue("Question2"); 
      await context.PostAsync("Your leave is applied" + " " + "from" + " " + startDate + " " + "to" + " " + endDate); 
     }); 
    } 

ようになり、次のような形態でありますが完了し、2番目のフォームがルイスの意図によってトリガーされると、最初のフォームがポップアップします。私はDialogsを使わずに何かを探しています。

何か助けていただければ幸いです。 ありがとうございます。あなたは上記のコードで表示された場合、BuildTravelFormまたはBuildLeaveFormは明らかにエラーが発生し、Doのチェーンオペレーションを呼び出すことなく、それを終了することができ

if (leaveStatus == 1 && travelstatus==0) 
       { 
        //nested if to check intents to follow 
        await Conversation.SendAsync(activity, BuildLeaveForm); 
        await connector.Conversations.ReplyToActivityAsync(activity.CreateReply("Thanks")); 
       } 
       else if(travelstatus == 1 && leaveStatus==0) 
       { 
        await Conversation.SendAsync(activity, BuildTravelForm); 
        await connector.Conversations.ReplyToActivityAsync(activity.CreateReply("Thanks")); 
       } 

+0

ルートダイアログを使用して2つのフォームを切り替えることをお勧めします。なぜなら、別のダイアログを使用したくない理由があるからです。 –

答えて

0

この行は問題ですすべてが正常に実行された場合は、「実行」が呼び出されます。そうでない場合は、単にスキップします。したがって、ステータスをリセットする最も良い場所は、ダイアログの完了後に呼び出されることが保証されているawaitステートメントの後です。

私はこのように行います:それがうまく動作するかどうかをチェックしてください

if (leaveStatus == 1 && travelstatus==0) 
       { 
        //nested if to check intents to follow 
        await Conversation.SendAsync(activity, BuildLeaveForm); 
        travelstatus =0; leaveStatus=0; 
        await connector.Conversations.ReplyToActivityAsync(activity.CreateReply("Thanks")); 
       } 
       else if(travelstatus == 1 && leaveStatus==0) 
       { 
        await Conversation.SendAsync(activity, BuildTravelForm); 
        travelstatus =0; leaveStatus=0; 
        await connector.Conversations.ReplyToActivityAsync(activity.CreateReply("Thanks")); 
       } 

関連する問題