Как перехватить сообщение в FormFlow до того, как оно достигнет распознавателей?(использование enum) - PullRequest
0 голосов
/ 23 октября 2018

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

using Microsoft.Bot.Builder.Dialogs;
using Microsoft.Bot.Builder.FormFlow;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;


namespace BotApplication.App_Code
{
    public enum MainOptions { AccessoAreaRiservata = 1, AcquistoNuovaPolizza, RinnovoPolizza, Documenti, StatoPratica, AltroArgomento }

    [Serializable]
    public class MainReq
    {
        [Prompt("Indicare la tipologia della richiesta? {||}")]
        public MainOptions? MainOption;

        public static IForm<MainReq> BuildForm()
        {
            var form = (new FormBuilder<MainReq>()

                .Field(nameof(MainOption),validate: async (state, response) =>
                        {
                            var result = new ValidateResult { IsValid = true };
                          {
                            string risposta = (response.ToString());
                            if (risposta  == "AltroArgomento")
                            {
                                result.Feedback = "it works only if user choose an option";
                                result.IsValid = true;
                            }
                            return result;
                          }
                        })
                .Build()); 
            return form;
        }
    }
}

1 Ответ

0 голосов
/ 27 октября 2018

Есть несколько возможных обходных путей для вас.Обычно, если вы хотите учесть ситуации, когда пользователь хочет задать вопрос или сказать что-то, не связанное с формой, вы можете попросить его отменить форму, используя команду Quit .Если вы хотите, чтобы ваш бот был достаточно умным, чтобы интерпретировать, когда пользователи меняют тему в середине формы, это немного сложнее.

Если вы хотите продолжать использовать метод проверки, вы можете изменить свой MainOptionв поле string вместо MainOptions?, чтобы все пользовательские данные отправлялись в метод validate, но тогда вам нужно будет самостоятельно составить список вариантов выбора.

Я рекомендую использоватьпользовательский подсказчик вместо метода проверки.Я написал пост в блоге , в котором подробно рассказывается, как сделать такой суфлер.Сначала вы должны предоставить шаблон NotUnderstood , чтобы указать вашему подсказчику, когда сообщение недопустимо в FormFlow.Затем в подсказке вы вызываете диалоговое окно QnAMaker или делаете с сообщением все, что захотите.

// Define your NotUnderstood template
[Serializable, Template(TemplateUsage.NotUnderstood, NOT_UNDERSTOOD)]
public class MainReq
{
    public const string NOT_UNDERSTOOD = "Not-understood message";

    [Prompt("Indicare la tipologia della richiesta? {||}")]
    public MainOptions? MainOption;

    public static IForm<MainReq> BuildForm()
    {
        var form = (new FormBuilder<MainReq>()
            .Prompter(PromptAsync)  // Build your form with a custom prompter
            .Build());

        return form;
    }

    private static async Task<FormPrompt> PromptAsync(IDialogContext context, FormPrompt prompt, MainReq state, IField<MainReq> field)
    {
        var preamble = context.MakeMessage();
        var promptMessage = context.MakeMessage();

        if (prompt.GenerateMessages(preamble, promptMessage))
        {
            await context.PostAsync(preamble);
        }

        // Here is where we've made a change to the default prompter.
        if (promptMessage.Text == NOT_UNDERSTOOD)
        {
            // Access the message the user typed with context.Activity
            await context.PostAsync($"Do what you want with the message: {context.Activity.AsMessageActivity()?.Text}");
        }
        else
        {
            await context.PostAsync(promptMessage);
        }

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