Nano Hash - криптовалюты, майнинг, программирование

Как включать и выключать различные поля на основе значения другого поля в FormFlow

Я использую 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. Если пользователь выбирает Приложение, я хочу спросить пользователя только о ReportApplicationName, Дате начала, Дате окончания.

Случай 2: если пользователь выбирает Emotion, тогда я хочу спросить пользователя только о EmotionName и StartDate, EndDate.

Случай 3. Если пользователь выбирает AppVsEmotion, я хочу спросить пользователя о ReportApplicationName, EmotionName и Дате начала, Дата окончания

Случай 4: если пользователь выбирает Справка, я хочу спросить только о ReportApplicationName, StartDate, EndDate

Я пытался сделать следующее, но это не работает:

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

        }

Пожалуйста, помогите мне, если я слишком наивен. Я попытался выполнить следующее: Изменить поток сообщений в Microsoft Bot Framework< /а>


  • Почему SetNext не работает? 15.06.2017
  • @EzequielJadib Не запрашивает у пользователя следующее поле и закрывает форму с исключением Microsoft.Bot.Builder.FormFlow.FormCanceledException 15.06.2017
  • @EzequielJadib Вот полное исключение «Microsoft.Bot.Builder.FormFlow.FormCanceledException`1» в mscorlib.dll. 15.06.2017

Ответы:


1

Microsoft.Bot.Builder.FormFlow.FormCanceledException происходит, потому что ReportApplicationName не является одним из полей в конструкторе форм. Если вы добавите .Field(nameof(ReportApplicationName)) в сборку, исключение не возникнет.

Вам также потребуется использовать ActiveDelegate .Field для шагов ReportApplicationName и EmotionName, так как иногда вы хотите их пропустить. Возврат false из ActiveDelegate выполнит это.

Примечание. Я изменил 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();
            }
        }
16.06.2017
  • Большое спасибо, что нашли время и объяснили так понятно. Это решило мою проблему :) 17.06.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..