简体   繁体   English

如何动态地向自适应卡添加行?

[英]how dynamically add rows to adaptive card?

How do I create an adaptive card which will create a table for the bot answer, But that bot has a number of rows depend on rows fetched from the data source, it will fetch name and id from the data source, how to create data and bind that data in UI for an adaptive card here below bot code, I am not getting how dynamically add rows and bind data.我如何创建一个自适应卡来为机器人回答创建一个表,但该机器人有许多行取决于从数据源获取的行,它将从数据源获取名称和 ID,如何创建数据和在 bot 代码下方的自适应卡的 UI 中绑定该数据,我没有得到如何动态添加行和绑定数据。

public class EchoBot : ActivityHandler
{
    private const string WelcomeText = @"This bot will introduce you to AdaptiveCards.
                                        Type anything to see an AdaptiveCard.";

    // This array contains the file location of our adaptive cards
    private readonly string[] _cards =
    {
        //Path.Combine(".", "Resources", "FlightItineraryCard.json"),
        //Path.Combine(".", "Resources", "ImageGalleryCard.json"),
        //Path.Combine(".", "Resources", "LargeWeatherCard.json"),
        //Path.Combine(".", "Resources", "RestaurantCard.json"),
       // Path.Combine(".", "Resources", "SolitaireCard.json"),
        Path.Combine(".", "Resources", "School.json"),
    };

    protected override async Task OnMembersAddedAsync(IList<ChannelAccount> membersAdded, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
    {
        await SendWelcomeMessageAsync(turnContext, cancellationToken);
    }

    protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
    {

        // Random r = new Random();
        var fileRead = System.IO.File.ReadAllText("School.json");
        var item = (JObject)JsonConvert.DeserializeObject(fileRead);
        string classData = item["$data"].ToString();

        AdaptiveTransformer transformer = new AdaptiveTransformer();
        string cardJson = transformer.Transform(fileRead, classData);

        Microsoft.Bot.Schema.Attachment attachment = new Microsoft.Bot.Schema.Attachment();
        attachment.ContentType = "application/vnd.microsoft.card.adaptive";
        attachment.Content = JsonConvert.DeserializeObject(cardJson);
        var attachments = new List<Microsoft.Bot.Schema.Attachment>();

        //var reply = MessageFactory.Attachment(attachments);
        //reply.Attachments.Add(attachment);
        //return reply;

        // var cardAttachment = CreateAdaptiveCardAttachment(_cards[r.Next(_cards.Length)]);

        //turnContext.Activity.Attachments = new List<Attachment>() { cardAttachment };
        await turnContext.SendActivityAsync(MessageFactory.Attachment(attachments), cancellationToken);
        await turnContext.SendActivityAsync(MessageFactory.Text("Please enter any text to see another card."), cancellationToken);
    }

    private static async Task SendWelcomeMessageAsync(ITurnContext turnContext, CancellationToken cancellationToken)
    {
        foreach (var member in turnContext.Activity.MembersAdded)
        {
            if (member.Id != turnContext.Activity.Recipient.Id)
            {
                await turnContext.SendActivityAsync(
                    $"Welcome to Adaptive Cards Bot {member.Name}. {WelcomeText}",
                    cancellationToken: cancellationToken);
            }
        }
    }

    private static Microsoft.Bot.Schema.Attachment CreateAdaptiveCardAttachment(string filePath)
    {
        var adaptiveCardJson = System.IO.File.ReadAllText(filePath);
        var adaptiveCardAttachment = new Microsoft.Bot.Schema.Attachment()
        {
            ContentType = "application/vnd.microsoft.card.adaptive",
            Content = JsonConvert.DeserializeObject(adaptiveCardJson),
        };
        return adaptiveCardAttachment;
    }

Instead of getting static file from path, and putting it in attachment you need to separate template and data.您需要将模板和数据分开,而不是从路径中获取静态文件并将其放入附件中。

Check the following:检查以下内容:

https://docs.microsoft.com/en-us/adaptive-cards/templating/language https://docs.microsoft.com/en-us/adaptive-cards/templating/language

Also, this one has an example of how to separate template and data,另外,这个有一个如何分离模板和数据的例子,

How to map JSON Array with Adaptive Card Row - Using Designer to Create Template 如何使用自适应卡片行映射 JSON 数组 - 使用设计器创建模板

After you do that you will need to use templating API and render the card using code.完成此操作后,您将需要使用模板 API 并使用代码呈现卡片。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM