Как отменить/выйти или выйти из PromptDialog.Choice в Bot Framework?

PromptDialog.Choice в Bot Framework отображает список выбора, который работает хорошо. Тем не менее, я хотел бы иметь возможность отменить/экранировать/выйти из диалогового окна с указанием опции отмены/экранирования/выхода в списке. Есть ли что-нибудь в PromptDialog.Choice, что можно переопределить, так как я не нашел никакой опции отмены.

вот мой код в С#..

PromptDialog.Choice(
                 context: context,
                 resume: ChoiceSelectAsync,
                 options: getSoftwareList(softwareItem),
                 prompt: "We have the following software items matching " + softwareItem + ". (1), (2), (3). Which one do you want?:",
                 retry: "I didn't understand. Please try again.",
                 promptStyle: PromptStyle.PerLine);

Пример:

Бот: у нас есть следующие элементы программного обеспечения, соответствующие Photoshop. (1), (2), (3). Какую ты хочешь

  • Версия 1
  • Версия 2
  • Версия 3

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

Как мы это делаем?


person Sandy    schedule 09.03.2017    source источник


Ответы (3)


Есть два способа добиться этого:

  1. Добавьте отмену в качестве опции, как было предложено. Хотя это определенно сработает, в долгосрочной перспективе вы обнаружите, что много повторяетесь, плюс вы увидите опцию отмены в списке вариантов, что может быть нежелательно.
  2. Лучшим подходом было бы расширить текущий PromptChoice, чтобы добавить логику выхода/отмены. Хорошей новостью является то, что уже есть что-то реализованное, что вы можете использовать как есть или как основу для достижения ваших нужд. Взгляните на CancelablePromptChoice включен в репозиторий BotBuilder-Samples. здесь как его использовать.
person Ezequiel Jadib    schedule 09.03.2017
comment
Я прошел через CancleablePromptChoice в botbuilder, но я думаю, что это не работает с вводом чисел, когда он показывает список, я выбираю 1, затем снова n снова показывает список. Я попытался переопределить метод ScoreMatch, но он не возвращает первый элемент из списка. Чего-то не хватает? - person Sandy; 12.03.2017
comment
Я не думаю, что текущая функция «Подсказка» тоже не работает таким образом. Если вы хотите, чтобы пользователи могли выбирать по номеру, вам, возможно, придется обновить методы TryParse/ScoreMatch, чтобы выполнить свою пользовательскую логику ИЛИ включить номер в параметр. Я не думаю, что CancelablePromptChoice использует ScoreMatch. Он был создан задолго до того, как этот метод был добавлен. Вы можете переопределить этот метод и вызвать его из файла TryParse. - person Ezequiel Jadib; 13.03.2017
comment
да, вы правы, нынешний Prompt Choice не работает таким образом. Я переопределил ScoreMatch в CancleablePromptChoice, как показано ниже. - person Sandy; 14.03.2017

Просто добавьте опцию «отмена» в список и используйте переключатель в методе, который получает пользовательский ввод, затем вызовите свое основное руководство или что-то еще, что вы хотите сделать при отмене.

person The Memebot    schedule 09.03.2017

Текущий выбор подсказки не работает таким образом, чтобы пользователь мог выбирать по номеру. Я переопределил функцию ScoreMatch в CancleablePromptChoice, как показано ниже.

public override Tuple<bool, int> ScoreMatch(T option, string input)
        {
            var trimmed = input.Trim();
            var text = option.ToString();

            // custom logic to allow users to select by number
            int isInt;
            if(int.TryParse(input,out isInt) && isInt <= promptOptions.Options.Count())
            {
                text = promptOptions.Options.ElementAt(isInt - 1).ToString();
                trimmed = option.ToString().Equals(text) ? text :trimmed;
            }           

            bool occurs = text.IndexOf(trimmed, StringComparison.CurrentCultureIgnoreCase) >= 0;
            bool equals = text == trimmed; 
            return occurs ? Tuple.Create(equals, trimmed.Length) : null;
        }

@Ezequiel Еще раз спасибо!.

person Sandy    schedule 14.03.2017
comment
Есть ли какая-либо реализация для PromtDialog.String или PromtDialog.Int? - person Sandip; 05.01.2018