1

我正在使用 FormFlow 使用 botFrameWork(C#) 构建我的机器人。我想要求用户从四个报告中选择一个,并在选择的基础上打开和关闭某些字段并只询问与选择相关的问题。

以下是报告类型的枚举:

public enum ReportType
    {
        Application = 1,
        Emotion,
        AppVsEmotion,
        Help
    }

以下是所有字段:

public bool AskToChooseReport = true;

[Prompt("What kind of report you would like? {||}")]
public ReportType? Report { get; set; }

[Prompt("What is the application name?")]
public string ReportApplicationName { get; set; }


[Prompt("Please enter the emotion name? {||}")]
public string EmotionName { get; set; }

[Prompt("What is starting date (MM-DD-YYYY) for report?{||}")]
public string StartDate { get; set; }

[Prompt("What is the end date (MM-DD-YYYY) for report? {||}")]
public string EndDate { get; set; }

public string ReportRequest = string.Empty;

我有四种情况:

案例 1:如果用户选择Application,那么我只想向用户询问ReportApplicationNameStartDateEndDate

案例 2:如果用户选择Emotion,那么我只想向用户询问EmotionNameStartDateEndDate

案例 3:如果用户选择AppVsEmotion,我想向用户询问ReportApplicationNameEmotionNameStartDateEndDate

案例 4:如果用户选择Help,那么我只想询问ReportApplicationNameStartDateEndDate

我尝试执行以下操作,但它不起作用:

public static IForm<StandardInfoForm> BuildForm()
        {
#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously

            var parser = new Parser();
            return new FormBuilder<StandardInfoForm>()
                .Message("Welcome to reporting information!!")
                .Field(new FieldReflector<StandardInfoForm>( nameof(Report))
                    .SetActive( state => state.AskToChooseReport)
                    .SetNext( (value, state) =>
                    {
                        var selection = (ReportType)value;
                        if (selection == ReportType.Application)
                        {
                            state.ReportRequest = "application";
                            return new NextStep(new[] { nameof(ReportApplicationName) });
                        }
                        else if (selection == ReportType.Emotion)
                        {
                            state.ReportRequest = "emotion";
                            return new NextStep(new[] { nameof (EmotionName) });
                        }
                        else if (selection == ReportType.AppVsEmotion)
                        {
                            state.ReportRequest = "application,emotion";
                            return new NextStep(new[] { nameof (ReportApplicationName), nameof(EmotionName) });
                        }
                        else if (selection == ReportType.Help)
                        {
                            state.ReportRequest = "help";
                            return new NextStep(new[] { nameof(ReportApplicationName) });
                        }
                        else
                        {
                            return new NextStep();
                        }
                    }))               
                .Field(nameof(StartDate))
                .Field(nameof(EndDate), EndReportDateActive)                              
                .Confirm("Would you like to confirm.Yes or No")
#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously
                .Build();

        }

如果我太天真,请帮助我。我试图遵循这个: Change Flow Of Message In Microsoft Bot FrameWork

4

1 回答 1

2

Microsoft.Bot.Builder.FormFlow.FormCanceledException正在发生,因为ReportApplicationName它不是表单构建器中的字段之一。如果将 .Field(nameof(ReportApplicationName)) 添加到构建中,则不会发生异常。

您还需要将 .Field 的 ActiveDelegate 用于ReportApplicationNameEmotionName步骤,因为有时您想跳过它们。从 ActiveDelegate 返回 false 将完成此操作。

注意:我在枚举中将 Emotions 更改为 Feelings,因为 FormBuilder 在Emotion和之间的相似性方面遇到了麻烦,AppVsEmotion但这应该会让你朝着正确的方向前进:

public enum ReportType
    {
        Application = 1,
        Feelings,
        AppVsEmotion,
        Help
    }

    [Serializable]
    public class StandardInfoForm
    {
        public bool AskToChooseReport = true;

        [Prompt("What kind of report you would like? {||}")]
        public ReportType? Report { get; set; }

        [Prompt("What is the application name? {||}")]
        public string ReportApplicationName { get; set; }


        [Prompt("Please enter the emotion name?  {||}")]
        public string EmotionName { get; set; }

        [Prompt("What is starting date (MM-DD-YYYY) for report?{||}")]
        public string StartDate { get; set; }

        [Prompt("What is the end date (MM-DD-YYYY) for report? {||}")]
        public string EndDate { get; set; }

        public string ReportRequest = string.Empty;

        public static IForm<StandardInfoForm> BuildForm()
        {

            var parser = new Parser();
            return new FormBuilder<StandardInfoForm>()
                .Message("Welcome to reporting information!!")
                .Field(new FieldReflector<StandardInfoForm>(nameof(Report))
                            .SetActive(state => state.AskToChooseReport)
                            .SetNext(SetNext))
                .Field(nameof(ReportApplicationName), state => state.ReportRequest.Contains("application"))
                .Field(nameof(EmotionName), state => state.ReportRequest.Contains("emotion"))
                .Field(nameof(StartDate))
                .Field(nameof(EndDate), EndReportDateActive)
                .Confirm("Would you like to confirm.Yes or No")
            .Build();

        }

        private static NextStep SetNext(object value, StandardInfoForm state)
        {
            var selection = (ReportType)value;
            if (selection == ReportType.Application)
            {
                state.ReportRequest = "application";
                return new NextStep(new[] { nameof(ReportApplicationName) });
            }
            else if (selection == ReportType.Feelings)
            {
                state.ReportRequest = "emotion";
                return new NextStep(new[] { nameof(EmotionName) });
            }
            else if (selection == ReportType.AppVsEmotion)
            {
                state.ReportRequest = "application,emotion";
                return new NextStep(new[] { nameof(ReportApplicationName) });
            }
            else if (selection == ReportType.Help)
            {
                state.ReportRequest = "help";
                return new NextStep(new[] { nameof(ReportApplicationName) });
            }
            else
            {
                return new NextStep();
            }
        }
于 2017-06-16T02:54:23.667 回答