2016-11-11 19 views
9

Merhaba Microsoft Bot Framework uygulamasında yeniyim ve yanıt alamadığım bir sorum var. Bazı soruyu soran bir FormFlow var, belirli bir sorudan sonra botun bir mantık yapmasını ve buna göre iletileri göstermesini istiyorum (örneğin, kullanıcı 1. seçeneği seçtiyse ve sonra X iletisi gösterdiyse ve kullanıcı 2. seçenek seçiliyse mesaj Y). İşte Microsoft Bot Framework'deki iletilerin akışını değiştirin

benim kodudur:

Güncelleme kod Ezequiel'in öneri sonra

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(); 
     } 
    } 
} 
: Bu tuş şey olduğunu büyük bir question.The olan yardımı

cevap

5

için şimdiden

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

Teşekkür Field<T> sınıfının SetActive ve SetNext yöntemlerini kullanın. FieldReflector sınıfını kullanmayı düşünmelisiniz; Ancak kendi IField'ınızı uygulayabilirsiniz.

SetActive, FormFlow belgelerinin Dynamic Fields section numaralı belgede açıklanmıştır. Temel olarak, bir koşula dayanan alanı etkinleştiren bir temsilci sağlar.

SetNext, özel mantığınıza bağlı olarak formun hangi adımının geleceğine karar vermenizi sağlayacaktır.

ContosoFlowers örneğine bakabilirsiniz. Order formunda; benzer bir şey yapılmakta. Aşağıdaki hata aldı kod uygulamak çalışırken yardım

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

sayesinde : 'Alan ' 'SetNext' ve hiçbir uzantı yöntemi 'SetNext' için bir tanım içermiyor birinci kabul 'Field ' türünün argümanı bulunamadı (bir yönerge veya bir montaj referansı eksik misiniz?) Eksik olduğum dll yönünü işaret edebilir misiniz? Tekrar teşekkürler –

+0

Yöntemler, FieldReflector sınıfından. Kod parçacığına bir göz atın, alanınızı alan olarak tanımlamanız gerekir (new FieldReflector

+0

bu, numaralı sorunun cevabını aldığımda yaptığım şeydir. numaralı soruya kodu ekledim Yardım için yine –