Bots 从LUIS对话框中调用FormDialog

Bots 从LUIS对话框中调用FormDialog,bots,botframework,azure-language-understanding,Bots,Botframework,Azure Language Understanding,我陷入了我的路易斯对话。我正在打电话给FormDialog [LuisIntent("GetRestaurant")] public async Task GetRestaurant(IDialogContext context, LuisResult result) { try { FormDialog<AddressForm> addressForm = new FormDialog<AddressForm>(new A

我陷入了我的路易斯对话。我正在打电话给FormDialog

[LuisIntent("GetRestaurant")]
    public async Task GetRestaurant(IDialogContext context, LuisResult result) {
        try {
            FormDialog<AddressForm> addressForm = new FormDialog<AddressForm>(new AddressForm(), AddressForm.BuildAddressForm, FormOptions.PromptInStart);
            AddressForm address = new AddressForm();
            context.Call(addressForm, AddressFormCompleteAsync);
    }
[LuisIntent(“GetRestaurant”)]
公共异步任务GetRestaurant(IDialogContext上下文,LuisResult结果){
试一试{
FormDialog addressForm=新建FormDialog(新建addressForm(),addressForm.BuildAddressForm,FormOptions.PrompInstart);
AddressForm address=新的AddressForm();
调用(addressForm,AddressFormCompleteTasync);
}
调用后,Emulator返回表单对话框中的第一个提示(哪个城市?),并将下一个输入作为Luis输入,并尝试将其与LUISINT匹配

我的表单如下所示:

[Serializable]
public class AddressForm  {

    [Prompt(new string[] { "Which city?" })]
    public string City { get; set; }

    [Prompt("Which street?")]
    public string Street { get; set; }

    [Prompt("Which number?")]
    public string Number { get; set; }

    public static IForm<AddressForm> BuildAddressForm() {
        IForm<AddressForm> addressFrom = new FormBuilder<AddressForm>()
            .Field(nameof(City), validate: ValidateCityInformation)
            .Field(nameof(Street))
            .Field(nameof(Number), validate: ValidateNumberInformation, active: NumberEnabled)
            .Build();
        return addressFrom;
    }
[可序列化]
公共类地址表{
[提示(新字符串[]{“哪个城市?”}]
公共字符串City{get;set;}
[提示(“哪条街?”)]
公共字符串Street{get;set;}
[提示(“哪个号码?”)]
公共字符串编号{get;set;}
公共静态格式BuildAddressForm(){
IForm addressFrom=新FormBuilder()
.字段(名称(城市),验证:验证信息)
.Field(街道名称))
.Field(nameof(Number),validate:validateEnumberInformation,active:NumberEnabled)
.Build();
回信地址;
}
我的Resume方法还没有做很多工作,只是为了调试

private async Task AddressFormCompleteAsync(IDialogContext context, IAwaitable<AddressForm> result) {
        var adress = await result;
        context.Wait(MessageReceived);
    }
专用异步任务地址FormCompleteAsync(IDialogContext上下文,IAwaitable结果){
var地址=等待结果;
Wait(MessageReceived);
}
我如何保持在FormDialog中而不跳回我的LuisDialog? 如果我需要使用context.Forward(),那么我的AddressForm类是否需要为IDialog类型,以及如何处理AddressFrom类中的IAwaitable


谢谢您的帮助。

我现在想出了一个答案。它跳出了FormDialog,因为提示(显示在频道中)算作调用方法(我调用了LuisDialog)收到的消息,因此FormDialog和LuisDialog得到了一个context.Done。我必须更加小心地处理对话流。

嘿,你能指定在上面的示例中所做的哪些更改才能正常运行吗?