Bot框架(.Net) - 英雄卡按钮单击 - IAwaitable与自定义类型

时间:2017-04-04 10:02:43

标签: c# .net botframework

我有一个班级(让我们说 XYZ ),我将 XYZ 类型的列表作为按钮传递给英雄卡,这样当用户点击一个按钮,它返回被点击的项目的值。我有一个名为 getResult 的方法,它需要一个类型 XYZ 的值。

private async Task getResult(IDialogContext context, IAwaitable<XYZ> result) {}

上述方法是从context.Wait<XYZ>(getResult);

执行的

但是当我点击按钮时,会发生错误(InvalidTypeException: invalid type: expected Microsoft.MscaBot.Data.XYZ, have Activity)。

如何避免此错误并收到用户点击的项目?

更新 :(以下是我的代码的样子)

[Serializable]
public class XYZ
{
    public override string ToString()
    {
        return name;
    }
    public string name { get; set; }
    public Nullable<decimal> price { get; set; }
}

其他课程:

[Serializable]
public class TestDialog : IDialog<object>
{
    private static List<XYZ> listOfXYZ = new List<XYZ>() { new XYZ() { name = "MyName1", price = 20.23 }, new XYZ() { name = "MyName2", price = 50.63 } };

    public async Task StartAsync(IDialogContext context)
    {
        await ShowOptions (context);
    }

    private async Task ShowOptions(IDialogContext context)
    {
        var replyToConversation = context.MakeMessage();
        replyToConversation.Type = "message";


        List<CardAction> cardButtons = new List<CardAction>();
        foreach (var item in listOfXYZ)
        {
            CardAction CardButton = new CardAction()
            {
               Type = ActionTypes.ImBack,
               Title = item.ToString(),
               Value = item
            };
            cardButtons.Add(CardButton);
        }

        HeroCard heroCard = new HeroCard()
        {
            Text = "Please select one of the options below",
            Buttons = cardButtons,
        };
        Attachment myAttachment = heroCard.ToAttachment();
        replyToConversation.Attachments.Add(myAttachment);
        replyToConversation.AttachmentLayout = "list";
        await context.PostAsync(replyToConversation);
        context.Wait(getResult);
    }

    private async Task getResult(IDialogContext context, IAwaitable<IMessageActivity> result)
    {
         // Some logic here
    }
}

1 个答案:

答案 0 :(得分:1)

>...<div></div><svg>...</svg>< (或任何其他卡片)的CardAction最终会向机器人发布HeroCard。该活动的文本将是您在IMessageActivity中设置的值。

你想做的事是不可能的。您需要等待CardAction。如果您尝试将复杂对象作为值发送,请确保该对象可序列化,否则它将无法正常工作。