Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MicrosoftBot框架中的多种表单_C#_Botframework_Azure Language Understanding - Fatal编程技术网

C# MicrosoftBot框架中的多种表单

C# MicrosoftBot框架中的多种表单,c#,botframework,azure-language-understanding,C#,Botframework,Azure Language Understanding,我有两张表格。我需要根据用户输入访问这两个表单 表格如下: internal static IDialog<JObject> BuildTravelForm() { travelstatus = 1; leaveStatus = 0; return Chain.From(() => FormDialog.FromForm(TravelForm.BuildForm)) .Do(async (cont

我有两张表格。我需要根据用户输入访问这两个表单

表格如下:

 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;
        }
    }
内部静态IDialog BuildTravelForm()
{
travelstatus=1;
leaveStatus=0;
返回链.From(()=>FormDialog.FromForm(TravelForm.BuildForm))
.Do(异步(上下文、顺序)=>
{
尝试
{
travelstatus=0;
var完成=等待订单;
字符串源=(字符串)已完成。GetValue(“问题1”);
字符串目标=(字符串)已完成。GetValue(“问题2”);
wait context.PostAsync(“您的旅行请求正在等待审批”+”+“+”+”从“+”+源+“+”到“+”+目的地);
}
捕获(例外)
{
等待上下文。PostAsync(“谢谢”);
}
});
}
第二个是这样的

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);
        });
    }
内部静态IDialog BuildLeaveForm()
{
leaveStatus=1;
travelstatus=0;
返回链.From(()=>FormDialog.FromForm(LeaveForm.BuildForm))
.Do(异步(上下文、顺序)=>
{
leaveStatus=0;
var完成=等待订单;
string startDate=(string)completed.GetValue(“问题1”);
字符串endDate=(字符串)已完成。GetValue(“问题2”);
wait context.PostAsync(“您的假期从“+”+startDate+“+”应用到“+”+endDate”);
});
}
控制器方法如下所示

 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;
        }
    }
公共异步任务发布([FromBody]活动)
{
尝试
{
if(activity.Type==ActivityTypes.Message)
{
if(leaveStatus==1&&travelstatus==0)
{ 
//嵌套是否检查要遵循的意图
等待对话。SendAsync(活动,BuildLeaveForm);
}
else if(travelstatus==1&&leaveStatus==0)
{
等待对话。SendAsync(活动,BuildTravelForm);
}
其他的
{
ConnectorClient连接器=新的ConnectorClient(新Uri(activity.ServiceUrl));
StateClient StateClient=activity.GetStateClient();
字符串replyMessage=“”;
Luis stluis=await GetEntityFromLUIS(activity.Text);
if(stluis.intents.Count()>0)
{
活动回复;
///等待对话。sendaync(活动,MakeGreetings);
使用(var file=Assembly.getExecutionGassembly().GetManifestResourceStream(“Javis_V2.IntentLibrary.json”))
{
o2=JObject.Parse(新的StreamReader(file.ReadToEnd());
字符串luisIntent=stluis.intents[0]。intent;
如果(LUISINT==“离开经理”)
{
等待对话。SendAsync(活动,BuildLeaveForm);
}
else if(LUISINT==“TravelManager”)
{
等待对话。SendAsync(活动,BuildTravelForm);
}
其他的
{
leaveStatus=0;
travelstatus=0;
replyMessage=(字符串)o2.GetValue(Luisint);
如果(replyMessage==“”)
{
replyMessage=“对不起!我不明白你的意思”;
}
reply=activity.CreateReply(replyMessage);
等待连接器.Conversations.ReplyToActivityAsync(reply);
}
}
}
}
}
其他的
{
HandleSystemMessage(活动);
}
返回null;
}
捕获(异常扩展)
{
Debug.WriteLine(exp);
返回null;
}
}
问题是,当第一个表单完成时,当第二个表单通过luis intent触发时,第一个表单会弹出。我正在寻找一些不使用对话框的东西

感谢您的任何帮助。
提前感谢。

这一行就是问题所在:

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

一定要检查它是否工作正常

我们倾向于建议使用一个根对话框在这两种形式之间进行切换——有什么理由不想使用另一个对话框吗?