【问题标题】:How can I pass objects between dialogs in the Microsoft Bot Framework?如何在 Microsoft Bot Framework 中的对话框之间传递对象?
【发布时间】:2017-07-27 00:29:02
【问题描述】:

我正在尝试在 Bot Framework 中的两个对话框之间传递 IList<Attachment> 类型的对象。这是我的代码现在的样子:

主对话框:

[Serializable]
public class CarouselCardsDialog : IDialog<object>
{
    public async Task StartAsync(IDialogContext context)
    {
        context.Wait(this.MessageReceivedAsync);
    }

    public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
    {
        //This object, 'attachments' is what I need to pass to the child dialog.
        IList<Attachment> attachments = GetCardsAttachments();
        context.Call(new CarouselDialog(attachments), ResumeAfterPrompt);
    }

    private async Task ResumeAfterPrompt(IDialogContext context, IAwaitable<string> result)
    {
        string input = await result;
        await context.PostAsync(input);
        context.Wait(MessageReceivedAsync);
    }

    private static IList<Attachment> GetCardsAttachments()
    {
        //Get a list of attachment
    }
}

这是子对话框。我想将 CarouselCardsDialog 中的附件列表传递给这个对象:

[Serializable]
public class CarouselDialog : IDialog<string>
{
    private IList<Attachment> _attachments;

    public CarouselDialog(IList<Attachment> attachments)
    {
        _attachments = attachments;
    }

    public async Task StartAsync(IDialogContext context)
    {
        IMessageActivity reply = context.MakeMessage();
        reply.AttachmentLayout = AttachmentLayoutTypes.Carousel;
        reply.Attachments = _attachments;
        await context.PostAsync(reply);
        context.Wait(MessageReceivedAsync);
    }

    public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
    {
        IMessageActivity activity = await result;
        context.Done(activity.Text);
    }
}

但是,当我运行此代码时,我收到此错误:

例外:在程序集中键入“Microsoft.Bot.Connector.Attachment” 'Microsoft.Bot.Connector,版本=3.5.1.0,文化=中性, PublicKeyToken=31bf3856ad364e35' 未标记为可序列化。

我做错了什么?有没有办法解决这个问题?

【问题讨论】:

  • 错误消息使您的“附件”类听起来需要 [Serializable],否则依赖它的类也不会。
  • @CSmith 感谢您的意见。问题是 Attachment 类属于框架,所以我认为改变它并不实用。你知道这样的事情是否有解决方法吗?
  • 您可以创建自己的类,将其标记为可序列化并使用附件类中您感兴趣的值填充它..

标签: c# bots botframework


【解决方案1】:

不确定是否存在异常,但一种解决方法是为制作附件所需的所有数据创建一个模型,然后将此数据保存在上下文的 UserData 属性中。

context.UserData.SetValue<MyModel>("AttachmentsModel", instanceOfModel);

然后在您的第二个对话框中检索此模型

MyModel model;
context.UserData.TryGetValue<MyModel>("AttachmentsModel", out model);

我认为您也可以尝试在此属性中放置一个 IAttachment 对象,但模型会更好,因为它并不是真正用来容纳大对象的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多