FormFlow:使用重复问题添加多个实体 [英] FormFlow: add multiple entities using recurring questions

查看:86
本文介绍了FormFlow:使用重复问题添加多个实体的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在研究bot框架,并创建了一个聊天bot来娱乐,使您可以详细介绍家人/宠物的成员.

I've been playing around with the bot framework and creating a chat bot for fun that lets you detail the members of your family/pets.

是否有办法重复同样的问题,直到用户满意为止?下面的示例代码:

Is there a way to recur over the same set of questions until the user is satisfied? Example code below:

    [Prompt("What is your family name?")]
    public string familyName{ get; set; }

    [Prompt("What is your postcode?")]
    public string postcode { get; set; }

    [Prompt("Would you like to add a family member? {||}")]
    public bool AddPerson { get; set; }

    [Prompt("What is their name?")]
    public string PersonName { get; set; }

    [Prompt("How old are they?")]
    public string PersonAge{ get; set; }

    [Prompt("How are they related to you?")]
    public string PersonRelation{ get; set; }

    [Prompt("Would you like to add another family member? {||}")]
    public bool addAnotherPerson { get; set; }

 public IForm<Family> BuildForm()
    {
        return new FormBuilder<GetQuoteDialog>()
            .Field(nameof(familyName))
            .Field(nameof(postcode))

            //Choose to add a person to the family
            .Field(nameof(AddPerson))

            //Details of that person.
            .Field(new FieldReflector<Family>(nameof(PersonName))
            .SetActive((state) => state.AddPerson== true))
            .Field(new FieldReflector<Family>(nameof({PersonAge))
            .SetActive((state) => state.AddPerson== true))
            .Field(new FieldReflector<Family>(nameof({PersonRelation))
            .SetActive((state) => state.AddPerson== true))

            //Prompts the user to add another if they wish
            //Recurs to the PersonName field and lets them go through the 
            //process of adding another member
            .Field(new FieldReflector<Family>(nameof({AddAnotherMember))
            .SetActive((state) => state.AddPerson== true))


            .Confirm("Is this your family? {*}")
            .Build();
    }
}

有人对如何做到这一点有想法吗?

Does anyone have an idea on how to accomplish this?

我这样称呼表单流:

public async Task confirmAdd(IDialogContext context, IAwaitable<bool> result)
    {
        if (await result)
        {
            // builds and calls the form from here
            var myform = new FormDialog<BuildFamily>(new BuildFamily(), BuildForm, FormOptions.PromptInStart, null);
            context.Call<BuildFamily>(myform, End);
        }
    }

    private async Task End(IDialogContext context, IAwaitable<BuildFamily> result)
    {
        BuildFamily data = null;
        try
        {
            data = await result;
            await context.PostAsync("Nice family you got there :)");
        }
        catch (OperationCanceledException)
        {
            await context.PostAsync("You canceled the form!");
            return;
        }
    }

推荐答案

我不确定如何在FormFlow对话框中重复同样的问题,直到用户满意为止".但是,您可以向用户提问您想添加更多的家庭成员吗?"在调用对话框中,并实现相同类型的对话流程.删除PostalCode和FamilyName类型的问题,并将其放在单独的对话框中.然后,在添加家庭成员"对话框中执行以下操作:

I'm not sure how to "recur over the same set of questions until the user is satisfied" within a FormFlow dialog. However, you can ask the user the question "Would you like to add more family members?" in the calling dialog, and achieve the same type of conversation flow. Remove the PostalCode and FamilyName type questions, and put them in a separate dialog. Then, in the add family members dialog do something like this:

[Serializable]
    public class AddFamilyMembersDialog : IDialog<object>
    {
        List<Family> _familyMembers = new List<Family>();

        public Task StartAsync(IDialogContext context)
        {
            context.Wait(MessageReceivedAsync);

            return Task.CompletedTask;
        }

        private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)
        {
            PromptAddMembers(context);
        }

        private void PromptAddMembers(IDialogContext context)
        {
            PromptDialog.Text(context, AfterPromptAdd, "Would you like to add more family members?", null, 1);
        }

        private async Task AfterPromptAdd(IDialogContext context, IAwaitable<string> result)
        {
            var yesno = await result;

            if (yesno.ToLower() == "yes")
            {
                await context.Forward(FormDialog.FromForm(Family.BuildForm), AfterAdded, null, CancellationToken.None);
            }
            else
            {
                //_familyMembers contains everyone the user wanted to add
                context.Done(true);
            }
        }

        private async Task AfterAdded(IDialogContext context, IAwaitable<Family> result)
        {
            var member = await result;
            if (member != null)
                _familyMembers.Add(member);

            PromptAddMembers(context);
        }

        [Serializable]
        public class Family
        {
            [Prompt("What is their name?")]
            public string PersonName { get; set; }

            [Prompt("How old are they?")]
            public string PersonAge { get; set; }

            [Prompt("How are they related to you?")]
            public string PersonRelation { get; set; }

            public static IForm<Family> BuildForm()
            {
                return new FormBuilder<Family>()
                .AddRemainingFields()
                .Build();
            }
        }

    }

这篇关于FormFlow:使用重复问题添加多个实体的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆