Я хочу запросить дополнительное поле на основе его предыдущего результата поля в приложении Bot Framework

У меня есть код построителя форм в классе, я хочу подсказать пользователю на основе его ответа. если ответ пользователя для поля «ConfirmISTTimeZone» - «Да», тогда он должен запрашивать поле «TimeZone», иначе он должен напрямую запрашивать «Продолжительность». Как это сделать?

var formflow = new FormBuilder<FlightBooking>().Message("Tell me Flight details!")
        .Field(nameof(Flightname))
        .Field(nameof(StartDate), validate: ValidateStartDate)
        .Field(nameof(ConfirmISTTimeZone), validate: ValidateResponseOfTimeZone)
        .Field(nameof(TimeZone), validate: ValidateTimeZone)
        .Field(nameof(Duration), validate: ValidateDuration)

person Amol Pawar    schedule 23.05.2017    source источник


Ответы (2)


Вы можете использовать SetActiveметод для этого в FieldReflectorклассе.

var formflow = new FormBuilder<FlightBooking>().Message("Tell me Flight details!")
        .Field(nameof(Flightname))
        .Field(nameof(StartDate), validate: ValidateStartDate)
        .Field(nameof(ConfirmISTTimeZone), validate: ValidateResponseOfTimeZone)
        .Field(new FieldReflector<FlightBooking>(nameof(TimeZone))
               .SetActive(CheckActiveMethod)
               .SetValidate(ValidateTimeZone))
        .Field(nameof(Duration), validate: ValidateDuration)

CheckActiveMethod — это просто метод, который принимает состояние и возвращает либо true, если поле активно и должно запрашиваться, либо false, если поле можно пропустить.

person Xeno-D    schedule 23.05.2017
comment
хорошо. Спасибо, у меня есть один вопрос, метод ValidateTimeZone запускается каждый раз, когда выполняется конструктор форм, поскольку у меня есть код, связанный с БД, в ValidateTimeZone, я не хочу выполнять его каждый раз, так как это увеличит запрос к серверу, я хочу выполнить ValidateTimeZone только тогда, когда построитель форм обрабатывает поле TimeZone, - person Amol Pawar; 23.05.2017
comment
У меня была аналогичная проблема в прошлом. Сначала проверьте, имеет ли значение, переданное методу, значение, введенное пользователем, или значение по умолчанию. Если нет, то он, вероятно, все еще занят предыдущим шагом. После того, как значение станет действительным, оно также появится в состоянии, чтобы вы могли проверить, заполнено ли это значение вообще. - person Xeno-D; 23.05.2017
comment
У меня были проблемы с CheckActiveMethod. Я нашел решение лямбда для определения .SetActive -other-field-in-formf">здесь . Это прекрасно работает, потому что вы можете делать условные операторы на основе других переменных в классе. Например, мне нужно было показать поле на основе того, было ли другое поле истинным. так я и сделал. .Field(new FieldReflector<Account>(nameof(BusinessName)) .SetActive(state => state.IsBusinessAccount.Equals(true))) - person akasoggybunz; 06.11.2018

Другой вариант — включить «active: ActiveTimeZone» в поле TimeZone.

.Field(nameof(TimeZone), активно: ActiveTimeZone, проверить: ValidateTimeZone)

 private bool ActiveTimeZone(FlightBooking state)
    {
        bool setActive = true;
        if (!state.ConfirmISTTimeZone.Contains("Add ur condition here"))
            setActive = false;


        return setActive;

    }
person Sangeetha    schedule 23.05.2017