更改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(); 
     } 
    } 
} 
+1

感谢您的帮助, 试图执行我收到以下错误代码时: “字段”不包含关于“SetNext”和没有扩展方法“SetNext”的定义接受第一可以找到类型'Field '的参数(你是否缺少using指令或程序集引用?) 你能指出我的方向,我失踪的dll吗? 再次感谢 –

+0

这些方法来自FieldReflector类。看看代码片段,你将不得不将字段定义为字段(新FieldReflector

+0

这就是我做错时的错误 我在问题 中添加了代码谢谢再次寻求帮助 –