更改Microsoft Bot Framework中的消息流
问题描述:
您好,我是微软Bot Framework的新手,我有一个问题,我无法找到答案。 我有一个FormFlow询问用户的一些问题,在一个特定的问题后,我想要机器人做一些逻辑并相应地显示消息(例如,如果用户选择选项1,然后显示消息X,并且如果用户选择选项2显示消息Y)。更改Microsoft Bot Framework中的消息流
这里是我的代码:
using Microsoft.Bot.Builder.FormFlow;
using Microsoft.Bot.Builder.Dialogs;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace Bot_CRM.FormFlow
{
public enum RequestOptions { Unknown, CheckStatus, CreateCase };
[Serializable]
public class CaseFormFlow
{
public RequestOptions RequestType;
[Prompt("What is your first name?")]
public string FirstName;
public string LastName;
public string ContactNumber;
[Prompt("Please enter your id")]
public string Id;
public static IForm<CaseFormFlow> BuildForm()
{
OnCompletionAsyncDelegate<CaseFormFlow> processRequest = async (context, state) =>
{
await context.PostAsync([email protected]"Thanks for your request");
};
return new FormBuilder<CaseFormFlow>()
.Message("Hello and welcom to my service desk bot")
.Field(nameof(FirstName))
.Message("hello {FirstName}")
.Field(nameof(Id))
.Field(nameof(RequestType)) =>
//here if user select 1 start flow of check status and if user select 2 start flow of create case
.AddRemainingFields()
.Message("Thank you request. Our help desk team will get back to you shortly.")
.OnCompletion(processRequest)
.Build();
}
}
}
埃塞基耶尔的建议后
更新代码:
return new FormBuilder<CaseFormFlow>()
.Message("Hello and welcom to my service desk bot")
.Field(nameof(FirstName))
.Message("hello {FirstName}")
.Field(new FieldReflector<CaseFormFlow>(nameof(RequestType))
.SetActive(state => state.AskUserForRequestType)
.SetNext((value, state) =>
{
var selection = (RequestOptions)value;
if (selection == RequestOptions.CheckStatus)
{
return new NextStep(new[] { nameof(Id) });
}
else
{
return new NextStep();
}
}))
在此先感谢您的帮助
答
这是一个伟大的question.The关键是要使用Field<T>
类的SetActive和SetNext方法。你应该考虑使用FieldReflector类;尽管你可以实现你自己的IField。
SetActive在FormFlow文档的Dynamic Fields section中描述。基本上它提供了一个代表,使基于条件的字段。
SetNext将允许您根据您的自定义逻辑决定下一步表单的哪个步骤。
您可以看看ContosoFlowers示例。在Order表格;正在做类似的事情。
public static IForm<Order> BuildOrderForm()
{
return new FormBuilder<Order>()
.Field(nameof(RecipientFirstName))
.Field(nameof(RecipientLastName))
.Field(nameof(RecipientPhoneNumber))
.Field(nameof(Note))
.Field(new FieldReflector<Order>(nameof(UseSavedSenderInfo))
.SetActive(state => state.AskToUseSavedSenderInfo)
.SetNext((value, state) =>
{
var selection = (UseSaveInfoResponse)value;
if (selection == UseSaveInfoResponse.Edit)
{
state.SenderEmail = null;
state.SenderPhoneNumber = null;
return new NextStep(new[] { nameof(SenderEmail) });
}
else
{
return new NextStep();
}
}))
.Field(new FieldReflector<Order>(nameof(SenderEmail))
.SetActive(state => !state.UseSavedSenderInfo.HasValue || state.UseSavedSenderInfo.Value == UseSaveInfoResponse.Edit)
.SetNext(
(value, state) => (state.UseSavedSenderInfo == UseSaveInfoResponse.Edit)
? new NextStep(new[] { nameof(SenderPhoneNumber) })
: new NextStep()))
.Field(nameof(SenderPhoneNumber), state => !state.UseSavedSenderInfo.HasValue || state.UseSavedSenderInfo.Value == UseSaveInfoResponse.Edit)
.Field(nameof(SaveSenderInfo), state => !state.UseSavedSenderInfo.HasValue || state.UseSavedSenderInfo.Value == UseSaveInfoResponse.Edit)
.Build();
}
}
}
感谢您的帮助, 试图执行我收到以下错误代码时: “字段”不包含关于“SetNext”和没有扩展方法“SetNext”的定义接受第一可以找到类型'Field '的参数(你是否缺少using指令或程序集引用?) 你能指出我的方向,我失踪的dll吗? 再次感谢 –
这些方法来自FieldReflector类。看看代码片段,你将不得不将字段定义为字段(新FieldReflector
这就是我做错时的错误 我在问题 中添加了代码谢谢再次寻求帮助 –