FormFlow:使用反复出现的问题添加多个实体



我一直在使用机器人框架并创建一个聊天机器人来娱乐,让您详细说明您的家人/宠物的成员。

有没有办法重复同一组问题,直到用户满意为止?示例代码如下:

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

我不确定如何在 FormFlow 对话框中"重复同一组问题,直到用户满意"。 但是,您可以在呼叫对话框中向用户询问问题"是否要添加更多家庭成员?",并实现相同类型的对话流。 删除邮政编码和姓氏类型的问题,并将它们放在单独的对话框中。 然后,在"添加家庭成员"对话框中执行以下操作:

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

相关内容

  • 没有找到相关文章

最新更新