2016-12-26 54 views
0

我有兩種形式。我需要根據用戶輸入訪問這兩個表單。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"); 
       } 
      }); 
    } 

第二個是這樣

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); 
     }); 
    } 

控制器方法如下

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; 
     } 
    } 

的問題是,當第一種形式完成,當第二個表單通過luis意圖觸發時,第一個表單彈出。我正在尋找沒有使用對話框的東西。

任何形式的幫助表示讚賞。 在此先感謝。

+0

我們傾向於推薦使用根對話框在兩種形式之間切換 - 任何原因您不想使用另一個對話框? –

回答

0

此行是問題:

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")); 
       } 

如果你在上面的代碼中看到,BuildTravelForm或BuildLeaveForm可以清楚地產生錯誤並結束時不調用連鎖經營做。如果一切正常,它會調用Do,否則它會直接跳過它。因此,重置狀態的最佳位置是在完成對話後確保要調用的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")); 
       } 

做檢查是否正常工作。

相關問題