2017-08-02 7 views
1

J'utilise une zone de liste déroulante Carte adaptative pour afficher certaines catégories de produits. Une fois que l'utilisateur clique sur la catégorie que cette catégorie doit transmettre à une autre méthode et affiche tous les produits de cette catégorie dans une autre liste déroulante de carte adaptative et laisse l'utilisateur sélectionner un produit.Transmettre le résultat d'une zone de liste modifiable de carte à une autre méthode

Voici le code pour obtenir toutes les catégories à la zone de liste déroulante.

public async Task GetCategoryAdaptiveCard(IDialogContext context) 
    { 
     var replyToConversation = context.MakeMessage(); 
     replyToConversation.Attachments = new List<Attachment>(); 

     HttpResponseMessage response = new HttpResponseMessage(); 
     string query = string.Format(APIChatBot + "/AllCategory"); 

     using (var client = ClientHelper.GetClient()) 
     { 
      response = await client.GetAsync(query); 
     } 
     var categoryList = await response.Content.ReadAsAsync<IEnumerable<CategoryDTO>>(); 
     AdaptiveCard adaptiveCard = new AdaptiveCard(); 
     adaptiveCard.Speak = "Please Select A Category from the list"; 

     adaptiveCard.Body.Add(new TextBlock() 
     { 
      Text = "Please Select A Category from the list", 
      Size = TextSize.Normal, 
      Weight = TextWeight.Normal 
     }); 

     adaptiveCard.Body.Add(new TextBlock() 
     { 
      Text = "Category List", 
      Size = TextSize.Normal, 
      Weight = TextWeight.Normal 
     }); 

     List<AdaptiveCards.Choice> list = new List<AdaptiveCards.Choice>(); 

     foreach (var item in categoryList) 
     { 
      AdaptiveCards.Choice choice = new AdaptiveCards.Choice() 
      { 
       Title = item.CategoryName, 
       Value = item.Id.ToString() 
      }; 

      list.Add(choice); 
     } 
     adaptiveCard.Body.Add(new ChoiceSet() 
     { 
      Id = "Category", 
      Style = ChoiceInputStyle.Compact, 
      Choices = list 
     }); 

     Attachment attachment = new Attachment() 
     { 
      ContentType = AdaptiveCard.ContentType, 
      Content = adaptiveCard 
     }; 

     replyToConversation.Attachments.Add(attachment); 
     await context.PostAsync(replyToConversation); 
    } 

Voici la méthode que j'ai utilisée pour obtenir le produit pour la catégorie sélectionnée.

public async Task GetProductForCategory(IDialogContext context, string category) 
    { 
     var replyToConversation = context.MakeMessage(); 
     replyToConversation.Attachments = new List<Attachment>(); 

     HttpResponseMessage response = new HttpResponseMessage(); 
     string query = string.Format(APIChatBot + "/ProductByCategory/" + category); 

     using (var client = ClientHelper.GetClient()) 
     { 
      response = await client.GetAsync(query); 
     } 

     var productList = await response.Content.ReadAsAsync<IEnumerable<ProductDTO>>(); 

     if(productList .Count() == 0) 
     { 
      string message = "Sorry There Are No products For this Category" + category; 
      await context.PostAsync(message); 
     } 
     else 
     { 
      List<AdaptiveCards.Choice> list = new List<AdaptiveCards.Choice>(); 

      foreach (var item in productList) 
      { 
       AdaptiveCards.Choice choice = new AdaptiveCards.Choice() 
       { 
        Title = item.ProductName, 
        Value = item.Id.ToString() 
       }; 

       list.Add(choice); 
      } 

      AdaptiveCard adaptiveCard = new AdaptiveCard(); 
      adaptiveCard.Body.Add(new TextBlock() 
      { 
       Text = "List of Products for the Category " + category, 
       Size = TextSize.Normal, 
       Weight = TextWeight.Normal 
      }); 

      adaptiveCard.Body.Add(new TextBlock() 
      { 
       Text = "Please Select A Product From The List", 
       Size = TextSize.Normal, 
       Weight = TextWeight.Normal 
      }); 

      adaptiveCard.Body.Add(new ChoiceSet() 
      { 
       Id = "ProductForCategory", 
       Style = ChoiceInputStyle.Compact, 
       Choices = list 
      }); 

      Attachment attachment = new Attachment() 
      { 
       ContentType = AdaptiveCard.ContentType, 
       Content = adaptiveCard 
      }; 

      replyToConversation.Attachments.Add(attachment); 
      await context.PostAsync(replyToConversation); 
     } 
    } 

Comment puis-je transmettre la catégorie sélectionnée par l'utilisateur à la méthode qui sélectionne le produit en fonction de la catégorie?

+1

_ "n'a pas fonctionné" _ n'est pas utile. Veuillez montrer votre code, ce que vous attendiez et ce qui s'est réellement passé. – stuartd

+0

@stuartd J'ai édité la question et ajouté le code s'il vous plaît aidez-moi si vous pouvez – Azmy

Répondre

0

Si vous créez une chose carte d'adaptation comme ceci:

var reply = context.MakeMessage(); 
var card = new AdaptiveCard(); 

var choices = new List<Choice>(); 
choices.Add(new Choice() 
{ 
    Title = "Category 1", 
    Value = "c1" 
}); 
choices.Add(new Choice() 
{ 
    Title = "Category 2", 
    Value = "c2"      
}); 
var choiceSet = new ChoiceSet() 
{ 
    IsMultiSelect = false, 
    Choices = choices, 
    Style = ChoiceInputStyle.Compact, 
    Id = "Category" 
}; 
card.Body.Add(choiceSet); 
card.Actions.Add(new SubmitAction() { Title = "Select Category", Data = Newtonsoft.Json.Linq.JObject.FromObject(new { button = "select" }) }); 

reply.Attachments.Add(new Attachment() 
{ 
    Content = card, 
    ContentType = AdaptiveCard.ContentType, 
    Name = $"Card" 
}); 

await context.PostAsync(reply); 

Lorsque l'utilisateur sélectionne l'une des options, et clique sur le bouton, la valeur de l'activité résultante sera une jobject vous pouvez désérialiser et utiliser pour créer une carte adaptative spécifique au produit:

class CategorySelection 
{ 
    public string Category { get; set; } 
} 

var activityValue = activity.Value as Newtonsoft.Json.Linq.JObject; 
if (activityValue != null) 
{ 
    var categorySelection = activityValue.ToObject<CategorySelection>(); 
    var category = categorySelection.Category; 
    //query the database for products of this category type, 
    //create another adaptive card displaying the products and send to user 

    await context.PostAsync(reply); 
} 
+0

Y at-il un moyen que je peux le faire sans cliquer sur un bouton? je peux juste passer la valeur quand je clique sur le combo lui-même? – Azmy

+0

Pas que je sache. –

+0

quand je fais var categorySelection = activityValue.ToObject (); Je reçois une "Référence d'objet non définie sur une instance d'un objet". exception aucune idée pourquoi? – Azmy