Botframework v4: не удается рендерить карты - PullRequest
0 голосов
/ 06 января 2019

Это образец документации Botframework v4. Но это не работает. На эмуляторе бота Microsoft написано "Can't Render Card". То, что я пытаюсь сделать, это карусельная карта, но эта простая карта из образца Microsoft уже не работает.

    {
  "type": "message",
  "text": "Plain text is ok, but sometimes I long for more...",
  "attachments": [
    {
      "contentType": "application/vnd.microsoft.card.adaptive",
      "content": {
        "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
        "type": "AdaptiveCard",
        "version": "1.0",
        "body": [
          {
            "type": "TextBlock",
            "text": "Hello World!",
            "size": "large"
          },
          {
            "type": "TextBlock",
            "text": "*Sincerely yours,*"
          },
          {
            "type": "TextBlock",
            "text": "Adaptive Cards",
            "separation": "none"
          }
        ],
        "actions": [
          {
            "type": "Action.OpenUrl",
            "url": "http://adaptivecards.io",
            "title": "Learn More"
          }
        ]
      }
    }
  ]
}

Однако, если я удаляю верхнюю часть кода, этот код работает:

  {
  "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
  "type": "AdaptiveCard",
  "version": "1.0",
  "body": [
    {
      "type": "TextBlock",
      "text": "Hello World!",
      "size": "large"
    },
    {
      "type": "TextBlock",
      "text": "*Sincerely yours,*"
    },
    {
      "type": "TextBlock",
      "text": "Adaptive Cards",
      "separation": "none"
    }
  ],
  "actions": [
    {
      "type": "Action.OpenUrl",
      "url": "http://adaptivecards.io",
      "title": "Learn More"
    }
  ]
}

Вот как я называю карточку. Есть ли лучший способ сделать это?

 public class GetNameAndAgeDialog : WaterfallDialog
    {

        private readonly string _cards = @".\Resources\TryCarouselCard.json";

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

        public GetNameAndAgeDialog(string dialogId, IEnumerable<WaterfallStep> steps = null) : base(dialogId, steps)
        {

            AddStep(async (stepContext, cancellationToken) =>
            {
                var cardAttachment = CreateAdaptiveCardAttachment(_cards);
                var reply = stepContext.Context.Activity.CreateReply();
                reply.Attachments = new List<Attachment>() { cardAttachment };
                await stepContext.Context.SendActivityAsync(reply, cancellationToken);
                return await stepContext.ContinueDialogAsync();
            });
         }
      }

1 Ответ

0 голосов
/ 07 января 2019

«Верхняя часть» первого блока JSON, который вы разместили, - это карта, содержащаяся в упражнении. Второй блок JSON - это просто карта и то, что вы хотите поместить в Attachment.

Что касается вашего кода, мне он кажется правильным. Я мог бы рассмотреть кэширование вложения JSON, поскольку вы, вероятно, не хотите использовать файловую систему каждый раз, когда хотите отобразить карту, но это будет просто оптимизация.

Мне неясно, испытываете ли вы какие-либо дальнейшие проблемы или просто ищете подтверждение подхода сейчас. Если у вас все еще есть проблема, пожалуйста, обновите вопрос с более подробной информацией, и я обновлю свой ответ, чтобы попытаться помочь.

...