【问题标题】:Change flow of messages in Microsoft Bot Framework更改 Microsoft Bot Framework 中的消息流
【发布时间】:2016-11-11 08:01:46
【问题描述】:

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

这是我的代码:

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

根据 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();
                    }
                }))

提前感谢您的帮助

【问题讨论】:

    标签: c# botframework


    【解决方案1】:

    这是一个很好的问题。关键是使用Field&lt;T&gt; 类的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();
            }
        }
    }
    

    【讨论】:

    • 感谢您的帮助,在尝试实现代码时收到以下错误:“Field”不包含“SetNext”的定义,并且没有扩展方法“SetNext”接受第一个可以找到“Field”类型的参数(您是否缺少 using 指令或程序集引用?)您能指出我缺少的 dll 的方向吗?再次感谢
    • 方法来自 FieldReflector 类。查看代码 sn-p,您必须将字段定义为 Field(new FieldReflector
    • 这是我收到错误时所做的我在问题中添加了代码再次感谢您的帮助
    • 确保您有预期的用途:使用 Microsoft.Bot.Builder.FormFlow;使用 Microsoft.Bot.Builder.FormFlow.Advanced;
    • 我得到了它的工作,感谢所有的帮助最后问题出在模板 dll 不是最新版本。在我重新编译了 sdk 解决方案并复制了 dll 之后,它再次工作非常感谢您的所有帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多