Можно ли отправить значение местозаполнителя AdaptiveTextBlock в виде списка параметров для вызова веб-API - PullRequest
0 голосов
/ 29 января 2019

В боте у нас есть адаптивная карта, на которой пользователь может выбрать «да» или «нет».При выборе ДА пользователю предлагается ввести ключевые слова.После того, как пользователь вводит данные в текстовом блоке адаптивной карты, ввод должен быть захвачен и отправлен в качестве входного параметра в веб-API.

Пользовательский ввод будет передан в заполнителе блока AdaptiveTextInput.

    public static Attachment GetUserInputForCustomPPT()
    {
        AdaptiveCard card = new AdaptiveCard()
        {
            Id = "GetCustomPPT",
            Body = new List<AdaptiveElement>()
            {
                new AdaptiveTextBlock()
                {
                    Text = "Do you want to apply filter and customise the PPT?",
                    Wrap=true,
                   Size = AdaptiveTextSize.Small
                },
                new AdaptiveContainer()
                {
                    Id = "getCustomPPTNo",
                    SelectAction = new AdaptiveSubmitAction()
                   {
                        Id = "getCustomPPTNo",
                        Title = "No",
                        DataJson = "{ \"Type\": \"GetCustomPPT\" }",
                    }
                },
                new AdaptiveContainer()
                {
                    Id = "getCustomPPTYes",
                    Items = new List<AdaptiveElement>()
                    {
                        new AdaptiveTextBlock()
                        {
                            Text = "Please select an option",
                            Wrap=true,
                            Size = AdaptiveTextSize.Small
                        }
                    }
                },
            },
            Actions = new List<AdaptiveAction>()
            {
                new AdaptiveShowCardAction()
                {
                    Id = "GetPPTYes",
                    Title = "Yes",
                    Card = new AdaptiveCard()
                    {
                        Body = new List<AdaptiveElement>()
                        {
                            new AdaptiveTextBlock()
                            {
                                Text = "Please enter your input",
                                Wrap = true
                            },
                            new AdaptiveTextInput()
                            {
                                Id="GetUserInputKeywords",
                                Placeholder="Please enter the keyword list separated by ',' Ex:RPA,FS ",
                                MaxLength=490,
                                IsMultiline=true
                            }
                        },
                       Actions = new List<AdaptiveAction>()
                        {
                            new AdaptiveSubmitAction()
                            {
                                Id = "contactSubmit",
                                Title = "Submit",
                                DataJson = "{ \"Type\": \"GetPPT\" }"
                            },
                            new AdaptiveOpenUrlAction()
                            {
                                Id="CallApi",
                                Url=new Uri("https://xyz"+"RPA")
                                //card.Actions.Card.AdaptiveTextInput.Placeholder
                            }
                        }
                    }
                },
                 new AdaptiveShowCardAction()
                {
                    Id = "GetPPTNo",
                    Title = "No",
                    Card = new AdaptiveCard()
                    {
                        Body = new List<AdaptiveElement>()
                        {
                        },
                        Actions = new List<AdaptiveAction>()
                        {
                            new AdaptiveSubmitAction()
                            {
                                Id = "contactSubmit",
                                Title = "Submit",
                                DataJson = "{ \"Type\": \"GetPPTNo\" }"
                            }
                        }
                    }
                }
            }
        };
        // Create the attachment with adapative card. 
        Attachment attachment = new Attachment()
        {
            ContentType = AdaptiveCard.ContentType,
           Content = card
        };
        return attachment;
    }

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Да, вы можете извлечь входные значения из карты AdaptiveCard и использовать их в качестве параметров в HTTP-запросе к API.Когда пользователь отправляет AdaptiveCard, поля ввода отправляются в бот через действие в атрибуте Value.Вы можете проанализировать полученную строку JSON с JObject и получить значения для вашего вызова API.См. Пример ниже.

public async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken))
{

    if (turnContext.Activity.Type == ActivityTypes.Message)
    {   
        // Check if user submitted AdaptiveCard input
        if (turnContext.Activity.Value != null) {

            // Convert String to JObject
            String value = turnContext.Activity.Value.ToString();
            JObject results = JObject.Parse(value);

            // Get type from input field
            String name = results.GetValue("Type").ToString();

            // Get Keywords from input field
            String userInputKeywords = "";
            if (name == "GetPPT") {
                    userInputKeywords = results.GetValue("GetUserInputKeywords").ToString();
            }

            // Make Http request to api with paramaters
            String myUrl = $"http://myurl.com/api/{userInputKeywords}";

            ...

            // Respond to user
            await turnContext.SendActivityAsync("Respond to user", cancellationToken: cancellationToken);
        } else {
            // Send user AdaptiveCard
            var cardAttachment = GetUserInputForCustomPPT();
            var reply = turnContext.Activity.CreateReply();
            reply.Attachments = new List<Attachment>() { cardAttachment };
            await turnContext.SendActivityAsync(reply, cancellationToken);
        }
    }
}

Надеюсь, это поможет!

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

Используя маршрутизацию, вы можете передавать несколько параметров либо на самом маршруте, либо передавать параметры в строке запроса, через привязку модели или привязку значения содержимого.Для большинства распространенных сценариев это на самом деле работает очень хорошо.Пока вы передаете либо один сложный тип через операцию POST, либо несколько простых типов через строку запроса или буфер POST, проблем не возникает.Но если вам нужно передать несколько параметров, как это было легко сделать с помощью WCF REST или ASP.NET AJAX, это не так очевидно.

RouteTable.Routes.MapHttpRoute(
name: "ApiName",
routeTemplate: "photos/**{action}**/{title}",
defaults: new {
    title = RouteParameter.Optional,
    controller = "PhotoApi",
    **action =** **"GetPhotos"** });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...