Как вызвать другой метод после завершения processOrder в чат-боте с помощью FormFlow?

Я использую ФормФлоу. Когда бот закончит со всеми вопросами и вызовет processOrder, я хочу продолжить диалог, но не знаю, где мне вызвать другой метод:

 OnCompletionAsyncDelegate<Form> processOrder = async (context, state) =>
        {
            await context.PostAsync("You done");
              // context.Call(OnFormComplete);
        };

Когда я пытаюсь позвонить так, я получаю это сообщение:

Ошибка CS7036. Не указан аргумент, соответствующий требуемому формальному параметру «резюме» «IDialogStack.Call (IDialog, ResumeAfter)» Project1 C:\Projects\Good Version\v-17.2.2017\demo-Project1\Project1\Dialogs \Form.cs 34 Компилятор Активный компилятор IntelliSense

Я вызываю поток формы в этом режиме в моем rootdialog.cs:

 var myform = new FormDialog<Form>(new Form(), Form.BuildForm, FormOptions.PromptInStart, null);

                context.Call(myform, ResumeAfterOptionDialog);

Формбилдер это:

return new FormBuilder<Form>()
            .Field(nameof(Time))
            .Field(nameof(Number1))
            .Field(nameof(Number2))
            .AddRemainingFields()

             .Confirm("Would you like to process")
              .OnCompletion(processOrder)
            .Build();

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


person user2454923    schedule 22.02.2017    source источник
comment
после сборки formflow, как я могу вызвать другой диалог   -  person user2454923    schedule 22.02.2017


Ответы (1)


Вы бы сделали что-то подобное в своем классе formFlow:

[Serializable]
public class CustomFormDialog
{
    public DateTime Time { get; set; }
    public int Number1 { get; set; }
    public int Number2 { get; set; }

    public static IForm<CustomFormDialog> Build()
    {
        OnCompletionAsyncDelegate<CustomFormDialog> processOrder = async (context, state) =>
        {
            await context.Forward(new OtherFormDialog(state), onOtherFormProcessed, state, CancellationToken.None);
        };

        return new FormBuilder<CustomFormDialog>()
            .Field(nameof(Time))
            .Field(nameof(Number1))
            .Field(nameof(Number2))
            .AddRemainingFields()

            .Confirm("Would you like to process?")
            .OnCompletion(processOrder)
            .Build();
    }

    private static async Task onOtherFormProcessed(IDialogContext context, IAwaitable<CustomFormDialog> result)
    {
        var formValue = await result;

        await context.PostAsync($"You are again in the form: Time: {formValue.Time}, Number1: {formValue.Number1}, Number2: {formValue.Number2}");
    }
}

Я определил фиктивный диалог, который получает ответ диалога formFlow, делает некоторые вещи и вызывает готовое для этого диалога и возвращается к классу FormFlow:

public class OtherFormDialog : IDialog<CustomFormDialog>
{
    private readonly CustomFormDialog formData;

    public OtherFormDialog(CustomFormDialog prevState)
    {
        this.formData = prevState;
    }

    public async Task StartAsync(IDialogContext context)
    {
        //Here, we can do anything
        await context.PostAsync("I'll check your data. Please wait!");

        await context.PostAsync("Just joking! No validation at all.");
        context.Done(this.formData);
    }
}
person sGambolati    schedule 22.02.2017
comment
Большое спасибо за ваш ответ ... я очень ценю. Я хочу спросить еще кое-что, чего я не могу сделать... Я хочу вызвать свой rootDialog после того, как пользователь подтвердит поток форм... не могли бы вы посоветовать мне, как позвонить... где его вызвать? - person user2454923; 23.02.2017