使用context.Forward转发后,如何在CheckListDialog中获取result.Entities?
context.Forward转发对话框时,如何获取传入的LUIS实体参数? 我有一个主LUIS对话框,需要通过context.Forward转发至CheckListDialog,并传入luisresult.entity,代码如下:
context.Forward(new CheckListDialog(), this.DialogResumeAfter, result.Entities, CancellationToken.None);
问题:在CheckListDialog中,如何获取传入的result.Entities?
补充说明:另有一个可行方案是使用context.Call,代码如下:
context.Call(new CheckListDialog(result.Entities), this.DialogResumeAfter);
该方案可正常运行,但我想了解使用context.Forward时获取该参数的方法。
你提到的context.Forward和context.Call核心区别在于:Call是直接通过构造函数给子对话框传参,而Forward是基于消息转发的机制传递数据。要在CheckListDialog中拿到通过Forward传入的实体,需要调整参数传递方式,具体步骤如下:
1. 修正context.Forward的调用逻辑
context.Forward的第三个参数要求是IMessageActivity类型的消息对象,不能直接传实体。你需要把result.Entities附加到消息的Value属性中再转发:
// 创建一个空消息实例,将LUIS实体存入Value属性 var forwardMsg = context.MakeMessage(); forwardMsg.Value = result.Entities; // 执行转发操作 await context.Forward(new CheckListDialog(), this.DialogResumeAfter, forwardMsg, CancellationToken.None);
2. 在CheckListDialog中读取实体
在CheckListDialog的StartAsync方法里,你可以通过context.Activity.Value获取传入的实体,记得做对应的类型转换:
public class CheckListDialog : IDialog<object> { public async Task StartAsync(IDialogContext context) { // 替换成你的LUIS实体实际类型 var receivedEntities = context.Activity.Value as YourLuisEntityType; if (receivedEntities != null) { // 这里就可以使用传入的实体数据了 await context.PostAsync($"成功获取到LUIS实体:{JsonConvert.SerializeObject(receivedEntities)}"); } // 继续对话流程 context.Wait(MessageReceivedAsync); } private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result) { // 后续对话逻辑处理 var inputMsg = await result; await context.PostAsync("CheckListDialog已收到你的消息"); context.Done(true); } }
为什么最初的直接传参不行?
你最初的代码直接把result.Entities作为第三个参数传入Forward,这不符合方法的签名要求(第三个参数必须是IMessageActivity类型),所以无法正确传递数据。通过将实体存入消息的Value属性,我们利用了Forward转发消息的特性,让子对话框能从对话上下文的活动数据中拿到目标参数。
如果你的Bot Framework版本是v4,核心思路类似:通过消息的Value或对话状态存储数据,再在子对话框中读取对应内容即可。
内容的提问来源于stack exchange,提问作者Joy Zhu

