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"));
}
一定要检查它是否工作正常 我们倾向于建议使用一个根对话框在这两种形式之间进行切换——有什么理由不想使用另一个对话框吗?