Условные поля в FormFlow - PullRequest
       23

Условные поля в FormFlow

0 голосов
/ 03 июля 2018

В настоящее время я занимаюсь разработкой простого приложения для чат-ботов с использованием Azure Bot Framework, реализованного с использованием C # и формопотока, и тестирую в Bot Emulator V4.

До сих пор я был в порядке, используя в основном интуицию и несколько онлайн-ресурсов, но недавно я столкнулся с небольшим препятствием и обнаружил, что документация по условным полям в FormFlow довольно скудна.

Короче говоря, сценарий выглядит следующим образом:

  • Форма спрашивает о лицах
  • Второй последний вопрос - «да» или «нет» относительно того, есть ли у пользователя какие-либо проблемы
  • В последнем вопросе они подробно описывают свои проблемы, если они будут иметь

Последнее должно действительно быть видимым, только если ответ пользователя на предпоследний вопрос был «да». Если пользователь отвечает «нет» на возникновение проблем, бот должен игнорировать поле «описание проблемы».

На данный момент у меня есть:

  public enum HadProblem
{
    Yes, No
};

Опции.

[Prompt("Have you had a problem? {||}")]
      public HadProblem? Problem;

Подсказка и видимые для выбора опции «да» и «нет».

Последний вопрос - просто строковый ввод:

[Prompt("Please give a {&} of the problem.")]
    //[Optional]
        public string description;

В настоящий момент, как вы можете видеть, я использовал тег [необязательный], поскольку он был наиболее близкой заменой условных полей. Я изо всех сил пытаюсь найти документацию, которая покрывает, как создать поле, появление которого зависит от другого значения поля.

Есть ли способ сделать поле описания проблемы видимым / ответственным, только , если ответ на 'HadProblem' был 'Да'?

Действительно неуместно вручную пропускать вопрос, если ответ «нет».

Заранее спасибо.

1 Ответ

0 голосов
/ 03 июля 2018

Вы можете использовать методы SetActive и SetNext класса Field<T>, полные образцы можно найти в документации , включая Multi-Dialog Bot образец и образец Contoso Flowers Bot и Order.cs в образце Contoso Flowers Bot для самой формы.

namespace ContosoFlowers.Models
{
    using System;
    using BotAssets;
    using Microsoft.Bot.Builder.FormFlow;
    using Microsoft.Bot.Builder.FormFlow.Advanced;
    using Services.Models;

    [Serializable]
    public class Order
    {
        public enum UseSaveInfoResponse
        {
            Yes,
            Edit
        }

        public string OrderID { get; set; }

        [Prompt]
        public string RecipientFirstName { get; set; }

        [Prompt(FieldCase = CaseNormalization.None)]
        public string RecipientLastName { get; set; }

        [Prompt]
        [Pattern(RegexConstants.Phone)]
        public string RecipientPhoneNumber { get; set; }

        [Prompt]
        [Pattern(@"^.{1,200}$")]
        public string Note { get; set; }

        [Prompt]
        [Pattern(RegexConstants.Email)]
        public string SenderEmail { get; set; }

        [Prompt]
        [Pattern(RegexConstants.Phone)]
        public string SenderPhoneNumber { get; set; }

        public string SenderFirstName { get; set; }

        public string SenderLastName { get; set; }

        public bool AskToUseSavedSenderInfo { get; set; }

        [Prompt]
        public UseSaveInfoResponse? UseSavedSenderInfo { get; set; }

        [Prompt]
        public bool SaveSenderInfo { get; set; }

        public string DeliveryAddress { get; set; }

        public string FlowerCategoryName { get; set; }

        public Bouquet Bouquet { get; set; }

        public DateTime DeliveryDate { get; set; }

        public string BillingAddress { get; set; }

        public bool Payed { get; set; }

        public PaymentDetails PaymentDetails { get; set; }

        public static IForm<Order> BuildOrderForm()
        {
            return new FormBuilder<Order>()
                .Field(nameof(RecipientFirstName))
                .Field(nameof(RecipientLastName))
                .Field(nameof(RecipientPhoneNumber))
                .Field(nameof(Note))
                .Field(new FieldReflector<Order>(nameof(UseSavedSenderInfo))
                    .SetActive(state => state.AskToUseSavedSenderInfo)
                    .SetNext((value, state) =>
                    {
                        var selection = (UseSaveInfoResponse)value;

                        if (selection == UseSaveInfoResponse.Edit)
                        {
                            state.SenderEmail = null;
                            state.SenderPhoneNumber = null;
                            return new NextStep(new[] { nameof(SenderEmail) });
                        }
                        else
                        {
                            return new NextStep();
                        }
                    }))
                .Field(new FieldReflector<Order>(nameof(SenderEmail))
                    .SetActive(state => !state.UseSavedSenderInfo.HasValue || state.UseSavedSenderInfo.Value == UseSaveInfoResponse.Edit)
                    .SetNext(
                        (value, state) => (state.UseSavedSenderInfo == UseSaveInfoResponse.Edit)
                        ? new NextStep(new[] { nameof(SenderPhoneNumber) })
                        : new NextStep()))
                .Field(nameof(SenderPhoneNumber), state => !state.UseSavedSenderInfo.HasValue || state.UseSavedSenderInfo.Value == UseSaveInfoResponse.Edit)
                .Field(nameof(SaveSenderInfo), state => !state.UseSavedSenderInfo.HasValue || state.UseSavedSenderInfo.Value == UseSaveInfoResponse.Edit)
                .Build();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...