2016-12-26 101 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")); 
       } 

做检查是否正常工作。

相关问题