Передача переменной в диалог в Microsoft BotBuilder C # .NET Core - PullRequest
2 голосов
/ 10 октября 2019

Я пытаюсь построить своего бота, используя этот пример .

Поток:

  1. Пользователь что-то пишет foo.
  2. Бот входит в диалог ...

Я застрял при получении первого сообщения пользователя foo в диалоге .

1 Ответ

0 голосов
/ 11 октября 2019

Вы можете получить пользовательский ввод из turnContext следующим образом:

string userInput = turnContext.Context.Activity.Text

Пример:

 public override async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken))
 {
     string userInput = turnContext.Activity.Text;
 }

Что касается передачи переменной в UserProfileDialog Вы можете сделать это следующим образом:

await innerDc.BeginDialogAsync(nameof(DialogFlowDialog), userInput );

BeginDialogAsync принимает необязательный аргумент ( Object ) для передачи в диалогзапускается.

В вашем UserProfileDialog этот аргумент можно получить из stepContext

Пример:

 private static async Task<DialogTurnResult> TransportStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
        {
            string userInput = string.Empty;

            // Options contains the information the waterfall dialog was called with
            if (stepContext.Options != null)
            {
                userInput = stepContext.Options.ToString();
            }
        }

Если вы хотите получить первое сообщение, отправленное пользователем, вы всегда можете получить его из контекста, если вы используете 05.multi-turn-prompt , вы можете получить его таким образом внутри UserProfileDialog

   private static async Task<DialogTurnResult> TransportStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
        {
            // this contains the text message the user sent
            string userInput = stepContext.Context.Activity.Text;
            // WaterfallStep always finishes with the end of the Waterfall or with another dialog; here it is a Prompt Dialog.
            // Running a prompt here means the next WaterfallStep will be run when the users response is received.
            return await stepContext.PromptAsync(nameof(ChoicePrompt),
                new PromptOptions
                {
                    Prompt = MessageFactory.Text("Please enter your mode of transport."),
                    Choices = ChoiceFactory.ToChoices(new List<string> { "Car", "Bus", "Bicycle" }),
                }, cancellationToken);
        }

или как это внутри вашего DialogBot

  public override async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken))
        {

            // this contains the text message the user sent
            string userInput = turnContext.Activity.Text;

            await base.OnTurnAsync(turnContext, cancellationToken);

            // Save any state changes that might have occured during the turn.
            await ConversationState.SaveChangesAsync(turnContext, false, cancellationToken);
            await UserState.SaveChangesAsync(turnContext, false, cancellationToken);
        }
...