Использование атрибута «Условия» для контроля выбора каждого элемента - PullRequest
0 голосов
/ 29 мая 2018

Я экспериментирую с примером Sandwich Order, который поставляется с учебным пособием по Bot Framework.В этом примере кода есть класс SandwichOrder, который содержит свойство списка для хранения начинки.

public enum ToppingOptions
{
    [Terms("except", "but", "not", "no", "all", "everything")]
    Everything = 1,

    Avocado, BananaPeppers, Cucumbers, GreenBellPeppers, Jalapenos,
    Lettuce, Olives, Pickles, RedOnion, Spinach, Tomatoes
}

[Serializable]
public class SandwichOrder
{
    [Prompt("Which {&} would you like? {||}")]
    [Describe("toppings")]
    public List<ToppingOptions> Toppings;

    public static IForm<SandwichOrder> BuildForm()
    {
        return new FormBuilder<SandwichOrder>()
            .Message("Welcome to the simple sandwich order bot!")
            .Build();
    }
};

Я экспериментирую с атрибутом Terms, как описано здесь

Расширенные возможности FormFlow

Когда я запускаю бота в эмуляторе, вопрос выбора начинки появляется как положено ....

enter image description here

Я ввожу свой выбор следующим образом ...

enter image description here

Результат не тот, который я ожидал.Бот резюмирует мой выбор следующим образом ...

enter image description here

Согласно учебнику, результат должен был быть ...

enter image description here

Мне не ясно, где я ошибся здесь.Может кто-нибудь помочь мне, пожалуйста?

1 Ответ

0 голосов
/ 29 мая 2018

На самом деле, я думаю, что вы пропустили часть урока.Вам нужно добавить код в компоновщик для обработки слов «все» и «но».

Код ниже показывает, как сделать для слова все.

.Field(nameof(Toppings),
                validate: async (state, value) =>
                {
                    var values = ((List<object>)value).OfType<ToppingOptions>();
                    var result = new ValidateResult { IsValid = true, Value = values };
                    if (values != null && values.Contains(ToppingOptions.everything))
                    {
                        result.Value = (from ToppingOptions topping in Enum.GetValues(typeof(ToppingOptions))
                                        where topping != ToppingOptions.everything && !values.Contains(topping)
                                        select topping).ToList();

                        value = result.Value;
                    }
                    return result;
                })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...