2016-12-26 6 views
0

У меня есть две формы. Мне нужно получить доступ к обеим формам на основе пользовательского ввода.Несколько форм в Microsoft bot framework

Формы являются

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

Проблема заключается в том, что, когда первая форма завершается, и когда вторая форма запускается по смыслу Луиса, появляется первая форма. Я ищу что-то без использования диалоговых окон.

Любые виды помощи приветствуются. Спасибо заранее.

+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. Если все будет выполнено нормально, это вызовет Do, иначе он просто пропустит его. Таким образом, наилучшим местом для сброса статуса является после утверждения ожидания, которое должно быть вызвано после завершения диалога.

Я буду делать так:

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

Как проверить, если он работает хорошо.