如何向HeroCard添加按钮并在单击时选择值

时间:2017-08-14 07:47:38

标签: c# bots botframework

我已经实施了英雄卡片旋转木马,以显示特定文档可以拥有的所有时间表。在英雄卡片中,我添加了一个按钮来选择特定的时间表。以下是代码

private async Task ShowSessionsHeroCard(IDialogContext context)
    {
        var replyToConversation = context.MakeMessage();
        replyToConversation.AttachmentLayout = AttachmentLayoutTypes.Carousel;
        replyToConversation.Attachments = await GetSessionHeroCard(context);
        //replyToConversation.Attachments.Add(GetSessionHeroCard());
        await context.PostAsync(replyToConversation);
    }

    private async Task<List<Attachment>> GetSessionHeroCard(IDialogContext context)
    {
        List<Attachment> list = new List<Attachment>();
        List<CardAction> cardButtons = new List<CardAction>();
        foreach (var sessionDetails in scheduleList)
        {
            string[] session = GetSplittedDetails(sessionDetails);

            hospitalName = session[0]; //Hospital Name: {0}
            availableDay = session[1]; //Available Day: {1}
            appointmentNo = session[2]; // Appoinment No: {2}
            sessionAvailable = session[3]; // Session: {3}

            HeroCard hero = new HeroCard()
            {
                Title = hospitalName,
                Subtitle = availableDay,
                Text = sessionAvailable + appointmentNo,
                Buttons = cardButtons
            };

            list.Add(hero.ToAttachment());

        }

        CardAction getSessionValues = new CardAction()
        {
            Value = hospitalName + availableDay + sessionAvailable + appointmentNo,
            Type = ActionTypes.ImBack,
            Title = " Select Appointment "
        };

        cardButtons.Add(getSessionValues);

        string selectedAppointment = getSessionValues.Value.ToString();
        await GetSelectedAppointment(context, selectedAppointment);

        return list;
    }

     private async Task GetSelectedAppointment(IDialogContext context, string sessionSelected)
    {
        var replyToConversation = context.MakeMessage();
        //replyToConversation.AttachmentLayout = AttachmentLayoutTypes.List;

        string[] result = Utility.SplitSelectedApoitmentString(sessionSelected);
        var heroCard = new HeroCard()
        {
            Title = "Appointment Schedule",
            Subtitle = "These are the Appointment Details",
            Text = "Hospital selected : " + result[0] + "\n" + "Day of Appointment : " + result[1] + "\n" + "Time of Appointment : " + result[2] + "\n" + "Appointment Number" + result[3],
        }.ToAttachment();

        Attachment attachment = new Attachment()
        {
            Content = heroCard.Content,
            ContentType = heroCard.ContentType
        };
        replyToConversation.Attachments.Add(attachment);
        await context.PostAsync(replyToConversation);

    }

我的问题是

  1. 我是否正确定义了按钮?
  2. 即使在点击之前,CardAction getSessionValues也会获得一些值 在按钮上。如何避免这种情况。
  3. 如何获取所选卡值并将其传递给其他方法。
  4. 我无法弄清楚这里有什么问题请帮助。 (我肯定在做一些非常愚蠢的事情。)

    提前致谢:)

1 个答案:

答案 0 :(得分:2)

有点难以理解您的代码,并且不清楚是谁调用GetSessionHeroCard方法,但是,我认为您对如何处理卡片存在误解。

使用带按钮的卡时需要遵循的一般步骤是:

  1. 使用卡片操作
  2. 创建卡片
  3. 将卡添加为机器人将发送给用户的回复消息的附件
  4. 使用context.Wait等待X方法(可能在MessageReceivedAsync或新方法中)。这是关键,因为这个方法是一旦点击按钮就会收到带有值的消息。
  5. 您可以查看RichCards示例和Contoso Flowers示例,以便了解相关信息。