SDKs de Modelagem de Cartão Adaptável

Os SDKs de Modelagem de Cartão Adaptável tornam mais fácil popular um modelo de cartão com os dados reais em qualquer plataforma compatível.

Leia a Visão geral da Modelagem de Cartão Adaptável

Importante

Alterações da falha na versão Release Candidate de maio de 2020

Temos trabalhado duro para lançar a modelagem e, por fim, estamos na reta final. Com a proximidade do lançamento, tivemos que fazer algumas pequenas alterações da falha.

Alterações da falha a partir de maio de 2020

  1. A sintaxe de associação foi alterada de {...} para ${...}.
    • Por exemplo: "text": "Hello {name}" se torna "text": "Hello ${name}"
  2. A API JavaScript não contém mais um objeto EvaluationContext. Passe com facilidade seus dados para a função expand. Confira a Página de SDKs para obter todos os detalhes.
  3. A API .NET foi reprojetada para adequar-se melhor à API JavaScript. Consulte as informações abaixo para obter todos os detalhes.

JavaScript

A biblioteca adaptivecards-templating está disponível em npm e por meio da CDN. Confira o link do pacote para obter a documentação completa.

npm

npm install

npm install adaptivecards-templating

CDN

<script src="https://unpkg.com/adaptivecards-templating/dist/adaptivecards-templating.min.js"></script>

Uso

O exemplo a seguir pressupõe que você também instalou a biblioteca adaptivecards para renderizar o cartão.

Se você não planeja renderizar o cartão, pode remover os códigos parse e render.

import * as ACData from "adaptivecards-templating";
import * as AdaptiveCards from "adaptivecards";
 
// Define a template payload
var templatePayload = {
    "type": "AdaptiveCard",
    "version": "1.0",
    "body": [
        {
            "type": "TextBlock",
            "text": "Hello ${name}!"
        }
    ]
};
 
// Create a Template instance from the template payload
var template = new ACData.Template(templatePayload);
 
// Expand the template with your `$root` data object.
// This binds it to the data and produces the final Adaptive Card payload
var cardPayload = template.expand({
   $root: {
      name: "Matt Hidinger"
   }
});
 
// OPTIONAL: Render the card (requires that the adaptivecards library be loaded)
var adaptiveCard = new AdaptiveCards.AdaptiveCard();
adaptiveCard.parse(cardPayload);
document.getElementById('exampleDiv').appendChild(adaptiveCard.render());

.NET

Nuget install

dotnet add package AdaptiveCards.Templating

Uso

// Import the library 
using AdaptiveCards.Templating;
var templateJson = @"
{
    ""type"": ""AdaptiveCard"",
    ""version"": ""1.2"",
    ""body"": [
        {
            ""type"": ""TextBlock"",
            ""text"": ""Hello ${name}!""
        }
    ]
}";

// Create a Template instance from the template payload
AdaptiveCardTemplate template = new AdaptiveCardTemplate(templateJson);

// You can use any serializable object as your data
var myData = new
{
    Name = "Matt Hidinger"
};

// "Expand" the template - this generates the final Adaptive Card payload
string cardJson = template.Expand(myData);

Funções personalizadas

Além das funções predefinidas, as funções personalizadas podem ser adicionadas à biblioteca de expressões adaptáveis.

No exemplo abaixo, é adicionada a função personalizada stringFormat, que é usada para formatar uma cadeia de caracteres.

string jsonTemplate = @"{
    ""type"": ""AdaptiveCard"",
    ""version"": ""1.0"",
    ""body"": [{
        ""type"": ""TextBlock"",
        ""text"": ""${stringFormat(strings.myName, person.firstName, person.lastName)}""
    }]
}";

string jsonData = @"{
    ""strings"": {
        ""myName"": ""My name is {0} {1}""
    },
    ""person"": {
        ""firstName"": ""Andrew"",
        ""lastName"": ""Leader""
    }
}";

AdaptiveCardTemplate template = new AdaptiveCardTemplate(jsonTemplate);

var context = new EvaluationContext
{
    Root = jsonData
};

// a custom function is added
AdaptiveExpressions.Expression.Functions.Add("stringFormat", (args) =>
{
    string formattedString = "";

    // argument is packed in sequential order as defined in the template
    // For example, suppose we have "${stringFormat(strings.myName, person.firstName, person.lastName)}"
    // args will have following entries
    // args[0]: strings.myName
    // args[1]: person.firstName
    // args[2]: strings.lastName
    if (args[0] != null && args[1] != null && args[2] != null) 
    {
        string formatString = args[0];
        string[] stringArguments = {args[1], args[2] };
        formattedString = string.Format(formatString, stringArguments);
    }
    return formattedString;
});

string cardJson = template.Expand(context);

Solução de problemas

P. Por que aparece um AdaptiveTemplateException ao chamar expand()?
A. Se a mensagem de erro é parecida com "O '<item incorreto>' na linha '<número de linha>' está malformado devido a '$data : ' pair".
Verifique se o valor fornecido para "$data" é um JSON válido, como um número, um booliano, um objeto e uma matriz, ou segue a sintaxe correta para a linguagem do Modelo Adaptável. Além disso, confirme se a entrada existe no contexto de dados no número de linha.

P. Por que aparece um ArgumentNullException ao chamar expand()?
A. Se a mensagem de erro é parecida com "Verifique se o contexto de dados pai está definido ou insira um valor não nulo para o '<item incorreto>' na linha '<número de linha>'".
Isso indica que não existe contexto de dados para a associação de dados solicitada. Verifique se o contexto de dados raiz está definido. Se ele existir, confirme se algum contexto de dados está disponível para a associação atual, conforme indicado pelo número de linha.

P. Por que data/hora no formato RFC 3389, por exemplo, "2017-02-14T06:08:00Z", quando usado com o modelo não funciona com funções TIME/DATE?
A. O NuGet do SDK do .NET versão 1.0.0-rc.0 exibe esse comportamento. Esse comportamento é corrigido nas versões subsequentes. O comportamento padrão do desserializador de json.net altera a cadeia de caracteres de formato data/hora e está desabilitado para as versões subsequentes. Use a função formatDateTime() para formatar a cadeia de caracteres de data/hora para RFC 3389, conforme visto neste exemplo ou você pode ignorar funções TIME/DATE e usar apenas formatDateTime(). Para obter mais informações sobre formatDateTime(), acesse este artigo.