2017-08-02 3 views
1

AdaptiveCardコンボボックスを使用して、いくつかのカテゴリの商品を表示しています。ユーザーがカテゴリをクリックすると、そのカテゴリは別の方法に渡され、そのカテゴリのすべての製品が別のアダプティブカードコンボボックスに表示され、ユーザーが製品を選択できるようになります。Adaptive cardコンボボックスの結果を別のメソッドに渡す

すべてのカテゴリをコンボボックスに表示するコードは次のとおりです。

ここでは、選択したカテゴリの製品を取得するために使用した方法です。

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); 
     } 
    } 

ユーザーが選択したカテゴリを、カテゴリに基づいて製品を選択する方法に渡すにはどうすればよいですか?

+1

_「役に立たない」あなたのコード、何が起こると予想されたのか、実際に何が起こったのかを示してください。 – stuartd

+0

@stuartd質問を編集してコードを追加しました。可能であれば助けてください – Azmy

答えて

0

あなたは、適応型のカードにこのようなものを作成した場合:ユーザーがいずれかのオプションを選択し、ボタンをクリックすると、結果のアクティビティの値は、作成するためにデシリアライズして使用することができますjオブジェクトになります

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); 

を製品固有のアダプティブカード:

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

ボタンをクリックせずにこれを行う方法はありますか?私はコンボ自体をクリックすると値を渡すことはできませんか? – Azmy

+0

私が知っているわけではありません。 –

+0

私はvarを行うcategorySelection = activityValue.ToObject ();私は "オブジェクトのインスタンスに設定されていないオブジェクト参照"を取得します。例外何か理由は? – Azmy

関連する問題