Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.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# 在Microsoft Bot框架中更改消息流_C#_Botframework - Fatal编程技术网

C# 在Microsoft Bot框架中更改消息流

C# 在Microsoft Bot框架中更改消息流,c#,botframework,C#,Botframework,您好,我是Microsoft Bot Framework的新手,我有一个问题找不到答案。 我有一个FormFlow,它向用户询问一些问题,在一个特定问题之后,我希望bot执行一些逻辑并相应地显示消息(例如,如果用户选择选项1,则显示消息X,如果用户选择选项2,则显示消息Y) 这是我的密码: using Microsoft.Bot.Builder.FormFlow; using Microsoft.Bot.Builder.Dialogs; using System; using System.Co

您好,我是Microsoft Bot Framework的新手,我有一个问题找不到答案。 我有一个FormFlow,它向用户询问一些问题,在一个特定问题之后,我希望bot执行一些逻辑并相应地显示消息(例如,如果用户选择选项1,则显示消息X,如果用户选择选项2,则显示消息Y)

这是我的密码:

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($@"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();
        }
    }
}
使用Microsoft.Bot.Builder.FormFlow;
使用Microsoft.Bot.Builder.Dialogs;
使用制度;
使用System.Collections.Generic;
使用System.Linq;
使用System.Web;
命名空间Bot_CRM.FormFlow
{
公共枚举请求选项{未知,检查状态,CreateCase};
[可序列化]
公共类案件流
{
公共请求选项请求类型;
[提示(“您的名字是什么?”)]
公共字符串名;
公共字符串LastName;
公共字符串联系人号码;
[提示(“请输入您的id”)]
公共字符串Id;
公共静态表单BuildForm()
{
OnCompletionAsyncDelegate processRequest=async(上下文、状态)=>
{
等待上下文。PostAsync($@“感谢您的请求”);
};
返回新的FormBuilder()
.Message(“您好,欢迎致电我的服务台机器人”)
.Field(name of(FirstName))
.Message(“你好{FirstName}”)
.字段(名称(Id))
.Field(nameof(RequestType))=>
//这里,如果用户选择1开始检查状态流,如果用户选择2开始创建案例流
.AddRemainingFields()
.Message(“感谢您的请求。我们的服务台团队将很快回复您。”)
.OnCompletion(processRequest)
.Build();
}
}
}
根据Ezequiel的建议更新了代码:

 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();
                    }
                }))
返回新的FormBuilder()
.Message(“您好,欢迎致电我的服务台机器人”)
.Field(name of(FirstName))
.Message(“你好{FirstName}”)
.Field(新的FieldReflector(名称(请求类型))
.SetActive(state=>state.AskUserForRequestType)
.SetNext((值、状态)=>
{
var selection=(RequestOptions)值;
if(selection==RequestOptions.CheckStatus)
{
返回新的NextStep(new[]{nameof(Id)});
}
其他的
{
返回新的NextStep();
}
}))

提前感谢您的帮助

这是一个很好的问题。关键是使用类的SetActive和SetNext方法。你应该考虑使用这个班级;尽管您可以实现自己的IField

SetActive在FormFlow文档的中进行了描述。基本上,它提供了一个委托,该委托根据条件启用字段

SetNext将允许您根据自定义逻辑决定表单的下一步操作

你可以看看样品。在形式上;类似的事情正在发生

 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();
        }
    }
}
publicstaticiformbuildorderform()
{
返回新的FormBuilder()
.字段(收件人姓名)
.字段(姓名(收件人姓氏))
.字段(姓名(收件人电话号码))
.字段(名称(注释))
.Field(新的FieldReflector(名称(UseSavedSenderInfo))
.SetActive(state=>state.AskToUseSavedSenderInfo)
.SetNext((值、状态)=>
{
变量选择=(UseSaveInfoResponse)值;
if(selection==UseSaveInfoResponse.Edit)
{
state.SenderEmail=null;
state.SenderPhoneNumber=null;
返回新的NextStep(new[]{nameof(SenderEmail)});
}
其他的
{
返回新的NextStep();
}
}))
.Field(新的FieldReflector(名称(发送邮件))
.SetActive(state=>!state.UseSavedSenderInfo.HasValue | | state.UseSavedSenderInfo.Value==UseSaveInfoResponse.Edit)
SetNext先生(
(值,状态)=>(state.UseSavedSenderInfo==UseSaveInfoResponse.Edit)
?新的下一步(新[]{nameof(SenderPhoneNumber)})
:new NextStep()))
.Field(name of(SenderPhoneNumber),state=>!state.UseSavedSenderInfo.HasValue | | state.UseSavedSenderInfo.Value==UseSaveInfoResponse.Edit)
.Field(name of(SaveSenderInfo),state=>!state.UseSavedSenderInfo.HasValue | | | state.UseSavedSenderInfo.Value==UseSaveInfoResponse.Edit)
.Build();
}
}
}

感谢您的帮助,在尝试实现代码时,我收到以下错误:“Field”不包含“SetNext”的定义,并且找不到接受“Field”类型的第一个参数的扩展方法“SetNext”(是否缺少using指令或程序集引用?)你能指出我丢失的dll的方向吗?再次感谢这些方法来自FieldReflector类。看看代码片段,您必须将字段定义为field(new FieldReflector这是我在遇到错误时所做的,我在问题中添加了代码再次感谢帮助确保您有预期的用法:使用Microsoft.Bot.Builder.FormFlow;使用Microsoft.Bot.Builder.FormFlow.Advanced;我让它工作了,感谢最后所有的帮助问题出现在模板dll中,而不是在我重新编译sdk解决方案并复制dll之后