2016-10-06 28 views
1

我有一個基本的形式。根據用戶的選擇,它會將其引導至各種形式的流。但我無法做到這一點。它在Microsoft BOT框架中一次又一次地重複第一個formFlow?如何在Microsoft bot框架中的多個表單之間切換?

//These are two forms that i have initiated. If a count is 1 then it must open first formflow otherwise the second formflow. 
    internal static IDialog<General> MakeRootDialog() 
    { 
     return Chain.From(() => FormDialog.FromForm(General.BuildForm)); 
    } 
    internal static IDialog<ProfileForm> MakeRootDialog1() 
    { 
     return Chain.From(() => FormDialog.FromForm(ProfileForm.BuildForm)); 
    } 
     public async Task<HttpResponseMessage> Post([FromBody]Activity activity) 
    { 
     if (activity.Type == ActivityTypes.Message && General.count == 0) 
     { 
      await Conversation.SendAsync(activity, MakeRootDialog); 
      General.count = 1; 

     } 
     else if(activity.Type == ActivityTypes.Message && General.count >= 1) 
     { 
      await Conversation.SendAsync(activity, MakeRootDialog1); 
     } 
     else 
     { 
      HandleSystemMessage(activity); 
     } 
     var response = Request.CreateResponse(HttpStatusCode.OK); 
     return response; 
    } 
+0

你能否包含一些代碼來理解你在做什麼以及爲什麼它不工作?很難爲您提供當前細節的答案。你有一個PromptChoice,並根據用戶選擇,你想啓動一個FormFlow嗎?你想從哪裏切換表單? –

+0

我已添加上面的代碼。 –

+0

@EzequielJadib請看上面的代碼,我剛剛添加了 –

回答

2

我能夠重現這個問題,但我仍然在思考如何在MessageController中使用Chains來解決這個問題。

我建議解除阻止您將表單的「IF」邏輯移動到單獨的對話框中。像下面這樣:

控制器

public async Task<HttpResponseMessage> Post([FromBody]Activity activity) 
{ 
    if (activity.Type == ActivityTypes.Message) 
    { 
     await Conversation.SendAsync(activity,() => new RootDialog()); 
    } 
    else 
    { 
     HandleSystemMessage(activity); 
    } 

    var response = Request.CreateResponse(HttpStatusCode.OK); 
    return response; 
} 

RootDialog

[Serializable] 
public class RootDialog : IDialog<object> 
{ 
    public async Task StartAsync(IDialogContext context) 
    { 
     context.Wait(this.MessageReceivedAsync); 
    } 

    private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result) 
    { 
     if (General.count == 0) 
     { 
      General.count = 1; 

      context.Call(FormDialog.FromForm<General>(General.BuildForm, FormOptions.PromptInStart), async (ctx, formResult) => ctx.Wait(this.MessageReceivedAsync)); 
     } 
     else if (General.count >= 1) 
     { 
      context.Call(FormDialog.FromForm<ProfileForm>(ProfileForm.BuildForm, FormOptions.PromptInStart), async (ctx, formResult) => ctx.Wait(this.MessageReceivedAsync)); 
     } 
    } 
} 

這是一個個人的意見=>我更喜歡使用對話框,因爲一旦機器人開始生長更容易遵循邏輯並分離組件。

+0

你真棒!謝謝:) –

+0

嘿是否有可能在表單完成階段的formflow中返回圖像?等待context.PostAsync(「填寫表單」Thankyou);//這裏,而不是發回文本。我可以在postAsync中發送一些圖像嗎? –

+0

當然! BotFramework具有附件的概念。您可以發送圖像作爲回覆消息的一部分。查看Send Attachment示例以獲取更多信息:https://github.com/Microsoft/BotBuilder-Samples/tree/master/CSharp/core-SendAttachment。順便說一句,在這個回購中,你會發現很多以任務爲中心的樣本,我相信你會發現有用的。 –

相關問題