首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在FormFlow中设置BotFramework默认数据

在FormFlow中设置BotFramework默认数据
EN

Stack Overflow用户
提问于 2017-02-17 03:00:11
回答 2查看 1.1K关注 0票数 0

我正在使用BotBuilder的C# SDK作为BotFramework,我想做以下事情。

我有一个FormFlow对话框,它收集预订表格的信息。FormFlow中的一项是询问名称。在另一个对话框中,我正在收集名称并将其保存到userData。

代码语言:javascript
复制
context.UserData.SetValue<string>("Name", userName);

我的表单流看起来像这样。

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Microsoft.Bot.Builder.FormFlow;
using Microsoft.Bot.Builder.FormFlow.Advanced;
using System.Text.RegularExpressions;
using System.Threading.Tasks;


namespace DinnerBot.Dialogs
{   
    [Serializable]
    public class ReservationDialog
    {

        public enum SpecialOccasionOptions
        {
            Birthday,
            Anniversary,
            Engagement,
            none
        }

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

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

        [Pattern(@"^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$")]
        public string PhoneNumber { get; set; }

        [Prompt("What date would you like to dine with us? example: today, tomorrow, or any date like 04-06-2017 {||}", AllowDefault = BoolDefault.True)]
        [Describe("Reservation date, example: today, tomorrow, or any date like 04-06-2017")]
        public DateTime ReservationDate { get; set; }

        public DateTime ReservationTime { get; set; }

        [Prompt("How many people will be joining us?")]
        [Numeric(1, 20)]
        public int? NumberOfDinners;
        public SpecialOccasionOptions? SpecialOccasion;

        [Numeric(1, 5)]
        [Optional]
        [Describe("for how you enjoyed your experience with Dinner Bot today (optional)")]
        public double? Rating;

        public static IForm<ReservationDialog> BuildForm()
        {
            return new FormBuilder<ReservationDialog>()
                .Field(nameof(Name))
                .Field(nameof(Email), validate: ValidateContactInformation)
                .Field(nameof(PhoneNumber))
                .Field(nameof(ReservationDate))
                .Field(new FieldReflector<ReservationDialog>(nameof(ReservationDialog.ReservationTime))
                    .SetPrompt(PerLinePromptAttribute("What time would you like to arrive?"))
                    ).AddRemainingFields()
                .Build();
        }

        private static Task<ValidateResult> ValidateContactInformation(ReservationDialog state, object response)
        {
            var result = new ValidateResult();
            string contactInfo = string.Empty;
            if (GetEmailAddress((string)response, out contactInfo))
            {
                result.IsValid = true;
                result.Value = contactInfo;
            }
            else
            {
                result.IsValid = false;
                result.Feedback = "You did not enter valid email address.";
            }
            return Task.FromResult(result);
        }

        private static bool GetEmailAddress(string response, out string contactInfo)
        {
            contactInfo = string.Empty;
            var match = Regex.Match(response, @"[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?");
            if (match.Success)
            {
                contactInfo = match.Value;
                return true;
            }
            return false;
        }

        private static PromptAttribute PerLinePromptAttribute(string pattern)
        {
            return new PromptAttribute(pattern)
            {
                ChoiceStyle = ChoiceStyleOptions.PerLine
            };
        }


    }
}

在我的根对话框中,我这样调用它。

代码语言:javascript
复制
                        context.Call(FormDialog.FromForm<ReservationDialog>(ReservationDialog.BuildForm,
                        FormOptions.PromptInStart), this.ReservationFormComplete);

如何让表单流跳过name字段,并从userData中获取名称(如果存在)?

EN

回答 2

Stack Overflow用户

发布于 2017-02-17 13:05:40

为Name属性定义FieldReflector.SetActive。例如:

代码语言:javascript
复制
.Field(new FieldReflector<ReservationDialog>(nameof(ReservationDialog.Name))
    .SetActive((state) => SetFieldActive(state, nameof(ReservationDialog.Name)))
    ...

然后在您的SetFieldActive委托中检查名称是否已经存在,如果存在,将值设置为state并返回false。则不会显示提示符。如果找不到名称,请返回true以显示提示。

我已经写了关于这个主题的a brief blog posta sample,你可能会感兴趣。

票数 0
EN

Stack Overflow用户

发布于 2017-02-18 02:45:52

您有一些更简单的选择。

1)使您的字段可为空,如果您在保存的机器人状态中设置它们,则默认情况下将跳过它们。(除非传入FormOptions.PromptFieldsWithValues。) 2)将值转换为EntityRecommendations。如果它们与表单中的字段匹配,则也会分配并跳过它们。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42282469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档