art*_*tie 4 c# bots botframework
我正在尝试IList<Attachment>在 Bot Framework 中的两个对话框之间传递一个类型的对象。这是我的代码现在的样子:
主对话框:
[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
}
}
Run Code Online (Sandbox Code Playgroud)
这是子对话框。我想将 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);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我运行此代码时,出现此错误:
例外:程序集“Microsoft.Bot.Connector, Version=3.5.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”中的类型“Microsoft.Bot.Connector.Attachment”未标记为可序列化。
我究竟做错了什么?有没有解决的办法?
不确定异常,但解决方法是为制作附件所需的所有数据创建模型,然后将此数据保存在上下文的 UserData 属性中。
context.UserData.SetValue<MyModel>("AttachmentsModel", instanceOfModel);
Run Code Online (Sandbox Code Playgroud)
然后在你的第二个对话框中检索这个模型
MyModel model;
context.UserData.TryGetValue<MyModel>("AttachmentsModel", out model);
Run Code Online (Sandbox Code Playgroud)
我认为您也可以尝试在此属性中放置一个 IAttachment 对象,但模型会更好,因为它并不是真正用于容纳大型对象。
| 归档时间: |
|
| 查看次数: |
3015 次 |
| 最近记录: |