Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用FormFlow在chatbot中完成processOrder后调用另一个方法?_C#_Visual Studio_Bots_Chatbot_Botbuilder - Fatal编程技术网

C# 如何使用FormFlow在chatbot中完成processOrder后调用另一个方法?

C# 如何使用FormFlow在chatbot中完成processOrder后调用另一个方法?,c#,visual-studio,bots,chatbot,botbuilder,C#,Visual Studio,Bots,Chatbot,Botbuilder,我正在使用FormFlow。当机器人完成所有问题和调用后,我想继续对话框,但我不知道应该在哪里调用另一个方法: OnCompletionAsyncDelegate<Form> processOrder = async (context, state) => { await context.PostAsync("You done"); // context.Call(OnFormComplete);

我正在使用FormFlow。当机器人完成所有问题和调用后,我想继续对话框,但我不知道应该在哪里调用另一个方法:

 OnCompletionAsyncDelegate<Form> processOrder = async (context, state) =>
        {
            await context.PostAsync("You done");
              // context.Call(OnFormComplete);
        };
OnCompletionAsyncDelegate processOrder=async(上下文、状态)=>
{
等待上下文。PostAsync(“您完成了”);
//调用(OnFormComplete);
};
当我试着这样打电话时,我得到了这样的信息:

错误CS7036未给出与“IDialogStack.Call(IDialog,ResumeAfter)”Project1 C:\Projects\Good Version\v-17.2.2017\demo-Project1\Project1\Dialogs\Form.cs 34编译器IntelliSense活动编译器所需的形式参数“resume”对应的参数

在我的rootdialog.cs中,我在此模式下调用表单流:

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

                context.Call(myform, ResumeAfterOptionDialog);
var myform=new FormDialog(new Form(),Form.BuildForm,FormOptions.prompinstart,null);
调用(myform、ResumeAfterOptionDialog);
Formbuilder是:

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

             .Confirm("Would you like to process")
              .OnCompletion(processOrder)
            .Build();
返回新的FormBuilder()
.字段(名称(时间))
.字段(名称(编号1))
.字段(名称(编号2))
.AddRemainingFields()
.确认(“您想处理吗”)
.OnCompletion(processOrder)
.Build();

我想继续对话,因为bot已停止。我如何调用另一个方法?我应该在哪里调用?

在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}");
    }
}
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);
    }
}
[可序列化]
公共类CustomFormDialog
{
公共日期时间{get;set;}
公共整数1{get;set;}
公共整数2{get;set;}
公共静态格式构建()
{
OnCompletionAsyncDelegate processOrder=async(上下文、状态)=>
{
wait context.Forward(new OtherFormDialog(state),onOtherFormProcessed,state,CancellationToken.None);
};
返回新的FormBuilder()
.字段(名称(时间))
.字段(名称(编号1))
.字段(名称(编号2))
.AddRemainingFields()
.确认(“是否要处理?”)
.OnCompletion(processOrder)
.Build();
}
已处理其他表单上的私有静态异步任务(IDialogContext上下文,IAwaitable结果)
{
var formValue=等待结果;
wait context.PostAsync($“您的格式是:Time:{formValue.Time},Number1:{formValue.Number1},Number2:{formValue.Number2}”);
}
}
我定义了一个虚拟对话框,它接收formFlow对话框的响应,并对该对话框执行一些操作并调用done,然后返回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}");
    }
}
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);
    }
}
公共类OtherFormDialog:IDialog
{
私有只读CustomFormDialog formData;
公共OtherFormDialog(CustomFormDialog prevState)
{
this.formData=prevState;
}
公共异步任务StartAsync(IDialogContext上下文)
{
//在这里,我们可以做任何事情
wait context.PostAsync(“我会检查您的数据,请稍候!”);
等待上下文。PostAsync(“只是开玩笑!根本没有验证。”);
context.Done(this.formData);
}
}

在formflow构建之后,我如何调用另一个对话框非常感谢您的回答…我非常感谢。我想问一些我不能做的事情。。。我想在用户确认formflow后调用我的rootDialog…请您建议我如何调用…在哪里调用?