0

我正在使用表单流。当机器人完成所有问题和调用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 所需的形参 'resume' 相对应的参数\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();

我想继续对话,因为机器人停止了。我怎样才能调用另一种方法,我应该在哪里调用?

4

1 回答 1

0

你会在你的 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 对话框的响应,并做一些事情并为该对话框调用 done 并返回 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);
    }
}
于 2017-02-22T21:32:51.660 回答