2016-11-11 13 views
9

में संदेशों का प्रवाह बदलें नमस्ते मैं माइक्रोसॉफ्ट बॉट फ्रेमवर्क में नया हूं और मेरे पास एक सवाल है कि मुझे इसका जवाब नहीं मिला। मेरे पास एक फॉर्मफ्लो है जो उपयोगकर्ता से कुछ प्रश्न के लिए पूछता है, एक विशिष्ट प्रश्न के बाद मैं चाहता हूं कि बॉट कुछ तर्क करे और तदनुसार संदेश दिखाएं (उदाहरण के लिए यदि उपयोगकर्ता ने विकल्प 1 चुना है तो संदेश एक्स दिखाएं और यदि उपयोगकर्ता ने विकल्प 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([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(); 
        } 
       })) 

मदद

उत्तर

5

के लिए अग्रिम धन्यवाद यह एक बढ़िया सवाल का मुख्य बात करने के लिए है Field<T> कक्षा के SetActive और SetNext विधियों का उपयोग करें। आपको FieldReflector कक्षा का उपयोग करने पर विचार करना चाहिए; हालांकि आप अपना खुद का आईफिल्ड कार्यान्वित कर सकते हैं।

SetActive को फॉर्मफ्लो दस्तावेज़ों के 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' के लिए एक परिभाषा शामिल नहीं है पहली बार एक को स्वीकार 'फील्ड ' प्रकार का तर्क पाया जा सकता है (क्या आप एक प्रयोग निर्देश या असेंबली संदर्भ खो रहे हैं?) क्या आप मुझे उस डेल की दिशा में इंगित कर सकते हैं जो मुझे याद आ रही है? धन्यवाद फिर से –

+0

विधियां फ़ील्ड रिफ्लेक्टर श्रेणी से हैं। कोड स्निपेट पर एक नज़र डालें, आपको फ़ील्ड (नया फ़ील्ड रिफ्लेक्टर <केसफॉर्मफ्लो) नाम दिया जाना चाहिए (नाम (आपका फ़ील्डनाम) –

+0

यह मुझे तब हुआ जब मुझे त्रुटि मिली मैंने प्रश्न प्रश्न में कोड जोड़ा फिर मदद के लिए –

संबंधित मुद्दे