首页 文章

FormFlow:使用重复问题添加多个实体

提问于
浏览
2

我一直在玩机器人框架并创建一个有趣的聊天机器人,让您详细了解您的家庭/宠物的成员 .

有没有办法在用户满意之前重复同一组问题?示例代码如下:

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

有没有人知道如何实现这一目标?

我将这样的表单流称为:

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

1 回答

  • 0

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

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

相关问题