Cambie el flujo de mensajes en Microsoft Bot Framework

Hola, soy nuevo en Microsoft Bot Framework y tengo una pregunta a la que no pude encontrar una respuesta. Tengo un FormFlow que le pide al usuario alguna pregunta, después de una pregunta específica, quiero que el bot haga algo de lógica y muestre mensajes en consecuencia (por ejemplo, si el usuario seleccionó la opción 1, entonces muestra el mensaje X y si el usuario selecciona la opción 2 muestra el mensaje Y).

Aquí está mi código:

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 BuildForm() { OnCompletionAsyncDelegate processRequest = async (context, state) => { await context.PostAsync($@"Thanks for your request"); }; return new FormBuilder() .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(); } } } 

Código actualizado después de la sugerencia de Ezequiel:

  return new FormBuilder() .Message("Hello and welcom to my service desk bot") .Field(nameof(FirstName)) .Message("hello {FirstName}") .Field(new FieldReflector(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(); } })) 

Gracias de antemano por la ayuda

Esta es una gran pregunta. La clave es usar los métodos SetActive y SetNext de la clase Field . Debería considerar usar la clase FieldReflector ; aunque puedes implementar tu propio IField.

SetActive se describe en la sección Campos dynamics de la documentación de FormFlow. Básicamente, proporciona un delegado que habilita el campo en función de una condición.

SetNext le permitirá decidir qué paso del formulario debe seguir en función de su lógica personalizada.

Puede echarle un vistazo a la muestra de ContosoFlowers . En el formulario de pedido ; algo similar se está haciendo.

  public static IForm BuildOrderForm() { return new FormBuilder() .Field(nameof(RecipientFirstName)) .Field(nameof(RecipientLastName)) .Field(nameof(RecipientPhoneNumber)) .Field(nameof(Note)) .Field(new FieldReflector(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(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(); } } } 
    Intereting Posts